二维树状数组和一维的也差不多,改一下add和query函数即可:即按行修改,行内单点修改即可
/* 二维树状数组,询问一个二维区间内的数之和 */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define maxn 1050 int s; int bit[maxn][maxn]; void add(int x,int y,int a){ for(int i=x;i<=s;i+=i&-i) for(int j=y;j<=s;j+=j&-j) bit[i][j]+=a; } int query(int x,int y){ int ans=0; for(int i=x;i;i-=i&-i) for(int j=y;j;j-=j&-j) ans+=bit[i][j]; return ans; } int main(){ int t,q,x,y,sum,l,r,a; scanf("%d%d",&t,&s); memset(bit,0,sizeof bit); while(scanf("%d",&q),q<3){ if(q==1){//区间加上一个数 scanf("%d%d%d",&x,&y,&a); x++;y++; add(x,y,a); } else if(q==2){ scanf("%d%d%d%d",&x,&y,&l,&r); x++;y++;l++;r++; printf("%d\n",query(l,r)-query(l,y-1)-query(x-1,r)+query(x-1,y-1)); } } return 0; }