有一个神奇的东西叫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); }