单点更新,区间查询
1 //树状数组:单点更新,区间查询 2 int n,c[K]; 3 void add(int x,int v) 4 { 5 while(x<=n) c[x]+=v,x+=x&-x; 6 } 7 int get_sum(int x) 8 { 9 int ret=0; 10 while(x) ret+=c[x],x-=x&-x; 11 return ret; 12 }
区间增减,单点查询
1 //树状数组:区间增减,单点查询 2 //修改区间[l,r]时:add(l,v),add(r+1,-v) 3 int n,c[K]; 4 void add(int x,int v) 5 { 6 while(x<=n) c[x]+=v,x+=x&-x; 7 } 8 int get_sum(int x) 9 { 10 int ret=0; 11 while(x) ret+=c[x],x-=x&-x; 12 return ret; 13 }
区间增减,区间查询
1 //树状数组:区间增减,区间查询 2 //修改区间[l,r]时:add(l,v),add(r+1,-v) 3 int n,c1[K],c2[K]; 4 void add(int x,int v) 5 { 6 for(int i=x;i<=n;i+=i&-i) c1[i]+=x,c2[i]+=x*v; 7 } 8 int get_sum(int x) 9 { 10 int ret=0; 11 for(int i=x;i<=n;i-=i&-i) ret+=x*c1[i]-c2[i]; 12 return ret; 13 }
二维树状数组:单点修改,区间查询
1 //二维树状数组:单点修改,区间查询 2 int c[K][K],N=1e3+5; 3 void add(int x,int y,int v) 4 { 5 for(int i=x;i<=N;i+=i&(-i)) 6 for(int j=y;j<=N;j+=j&(-j)) 7 c[i][j]+=v; 8 } 9 int get_sum(int x,int y) 10 { 11 int ret=0; 12 for(int i=x;i;i-=i&(-i)) 13 for(int j=y;j;j-=j&(-j)) 14 ret+=c[i][j]; 15 return ret&1; 16 }
二维树状数组:区间修改,单点查询
1 //二维树状数组:区间修改,单点查询 2 //修改矩形区域:(lx,ly),(lx,ry),(rx,ly),(rx,ry)时 3 //add(lx,ly,v),add(rx+1,ry+1,v),add(lx,ry+1,-v),add(rx+1,ly,-v); 4 int c[K][K],N=1e3+5; 5 void add(int x,int y,int v) 6 { 7 for(int i=x;i<=N;i+=i&(-i)) 8 for(int j=y;j<=N;j+=j&(-j)) 9 c[i][j]+=v; 10 } 11 int get_sum(int x,int y) 12 { 13 int ret=0; 14 for(int i=x;i;i-=i&(-i)) 15 for(int j=y;j;j-=j&(-j)) 16 ret+=c[i][j]; 17 return ret&1; 18 }