有一个神奇的东西叫lowbit

inline int lowbit(int x){
    return x&(-x);
}

修改时是每次+lowbit(i),查询(前缀和)时是每次-lowbit(i)

void modify(int p,int v){//给p位置的数+v
    for(int i=p;i<=n;i+=lowbit(i))tree[i]+=v;
}
int sum(int x){//求前x个数的和
    int tot=0;
    for(int i=x;i;i-=lowbit(i))tot+=tree[i];
    return tot;
}
int query(int l,int r){//求区间和
    return sum(r)-sum(l-1);
}