本题是二维树状数组的典型应用:
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; int c[1030][1030]; int order; int s; int lowbit(int t) { return t&(-t); } void update(int x,int y,int a) { while(x<=s) { int tempy = y; while(tempy<=s) { c[x][tempy]+=a; tempy+=lowbit(tempy); } x+=lowbit(x); } } int getSum(int x,int y) { int sum = 0; while(x>0) { int tempy = y; while(tempy>0) { sum+=c[x][tempy]; tempy-=lowbit(tempy); } x-=lowbit(x); } return sum; } int main() { scanf("%d",&order); while(order<3) { if(order == 0) { scanf("%d",&s); memset(c,0,sizeof(c)); } else if(order == 1) { int x,y,a; scanf("%d%d%d",&x,&y,&a); update(x+1,y+1,a); } else if(order == 2) { int x1,x2,y1,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); printf("%d\n",getSum(x2+1,y2+1)-getSum(x1,y2+1)-getSum(x2+1,y1)+getSum(x1,y1)); } scanf("%d",&order); } return 0; }