1 /* 2 题意 : 3 改变矩阵中元素值 ,求子矩阵的和 4 二维树状数组, 5 */ 6 7 #include<stdio.h> 8 #define N 1050 9 int s; 10 int map[N][N]; 11 int lowbit(int x) 12 { 13 return x&(-x); 14 } 15 void add(int x,int y,int d) 16 { 17 int i=x; 18 int j=y; 19 while(i<=s) 20 { 21 j=y; 22 while(j<=s) 23 { 24 map[i][j]+=d; 25 j=j+lowbit(j); 26 } 27 i=i+lowbit(i); 28 } 29 } 30 int sum(int l,int b) 31 { 32 int i=l; 33 int j=b; 34 int ans=0; 35 while(i>0) 36 { 37 j=b; 38 while(j>0) 39 { 40 ans+=map[i][j]; 41 j-=lowbit(j); 42 } 43 i-=lowbit(i); 44 } 45 return ans; 46 } 47 int main() 48 { 49 int l,i,j,x,y,d,L,b,r,t; 50 while(scanf("%d",&l)!=EOF) 51 { 52 if(l==3)break; 53 if(l==0) 54 { 55 scanf("%d",&s); 56 for(i=0;i<=s;i++) 57 for(j=0;j<=s;j++) 58 map[i][j]=0; 59 60 } 61 if(l==1) 62 { 63 scanf("%d%d%d",&x,&y,&d); 64 if(map[x+1][y+1]+d<0)continue; 65 add(x+1,y+1,d); 66 } 67 if(l==2) 68 { 69 scanf("%d%d%d%d",&L,&b,&r,&t); 70 int ans; 71 72 73 ans=sum(r+1,t+1)-sum(L,t+1)-sum(r+1,b)+sum(L,b); 74 75 printf("%d\n",ans); 76 } 77 } 78 }