一道二维的树状数组,用细节教你做人。。。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int maxn = 1100 + 50;
int c[maxn][maxn];
int tot;
int lowbit(int x){
return x & (-x);
}
int sum(int x, int y){
int t = 0;
for(int i = x; i > 0; i -= lowbit(i))
{
for(int j = y; j > 0; j -= lowbit(j)){
t += c[i][j];
}
}
return t;
}
int update(int x, int y, int d){
for(int i = x; i <= tot; i += lowbit(i)){
for(int j = y; j <= tot; j += lowbit(j)){
c[i][j] += d;
}
}
return 0;
}
int main(){
int x, y, a, x1, y1, x2, y2;
int tag;
while(scanf("%d", &tag) != EOF && tag != 3){
switch(tag){
case 0 : {
scanf("%d", &tot);
memset(c, 0, sizeof(c));
break;
}
case 1 : {
scanf("%d%d%d", &x, &y, &a);
++x; ++y;
update(x, y, a);
break;
}
case 2 : {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
x1++; x2++; y1++; y2++;
int ans = 0;
ans = sum(x2, y2) - sum(x2, y1 - 1) - (sum(x1 - 1, y2) - sum(x1 - 1, y1 - 1));
printf("%d\n", ans);
break;
}
default : break;
}
}
return 0;
}