http://acm.hdu.edu.cn/showproblem.php?pid=1892
二维树状数组
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=1010,maxn=1001; 6 int a[N][N],c[N][N]; 7 int lowbit(int x) 8 { 9 return x&(-x); 10 } 11 void add(int x,int px,int py,int maxn) 12 { 13 for(int i=px;i<=maxn;i+=lowbit(i)) 14 for(int j=py;j<=maxn;j+=lowbit(j)) c[i][j]+=x; 15 } 16 int sum(int px,int py) 17 { 18 int s=0; 19 for(int i=px;i>0;i-=lowbit(i)) 20 for(int j=py;j>0;j-=lowbit(j)) s+=c[i][j]; 21 return s; 22 } 23 int main() 24 { 25 int T,C=0; 26 scanf("%d",&T); 27 while(T--) 28 { 29 printf("Case %d:\n",++C); 30 memset(c,0,sizeof(c)); 31 for(int i=1;i<=maxn;i++) 32 for(int j=1;j<=maxn;j++) 33 { 34 a[i][j]=1; 35 add(1,i,j,maxn); 36 } 37 int q; 38 scanf("%d",&q); 39 while(q--) 40 { 41 char op[2]; 42 int x1,y1,x2,y2,n1,s; 43 scanf("%s",op); 44 switch(op[0]) 45 { 46 case 'S': 47 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 48 if(x1>x2) {int t=x1; x1=x2; x2=t;} 49 if(y1>y2) {int t=y1; y1=y2; y2=t;} 50 x2++; y2++; 51 s=sum(x2,y2)-sum(x1,y2)-sum(x2,y1)+sum(x1,y1); 52 printf("%d\n",s); 53 break; 54 case 'A': 55 scanf("%d%d%d",&x1,&y1,&n1); 56 x1++; y1++; 57 a[x1][y1]+=n1; 58 add(n1,x1,y1,maxn); 59 break; 60 case 'D': 61 scanf("%d%d%d",&x1,&y1,&n1); 62 x1++; y1++; 63 if(n1>a[x1][y1]) n1=a[x1][y1]; 64 a[x1][y1]-=n1; 65 add(-n1,x1,y1,maxn); 66 break; 67 case 'M': 68 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1); 69 x1++; y1++; x2++; y2++; 70 if(n1>a[x1][y1]) n1=a[x1][y1]; 71 a[x1][y1]-=n1; 72 add(-n1,x1,y1,maxn); 73 a[x2][y2]+=n1; 74 add(n1,x2,y2,maxn); 75 break; 76 } 77 } 78 } 79 return 0; 80 }