二维树状数组,其实对这种数组还不是很理解,只是简单的应用还是会了,而且也体会到了为运算的强大,呵呵
#include <iostream>
//#include <algorithm>
//#include <stack>
//#include <string>
//#include <string.h>
//#include <map>
using namespace std;
#define MAX 1002
int map[MAX][MAX];
int sum[MAX][MAX];
int Lowbit(int m)

...{
return m&(-m);
}
int Getsum(int i,int j)

...{
int tempj,s=0;
while(i>0)

...{
tempj = j;
while(tempj>0)

...{
s += sum[i][tempj];
tempj -= Lowbit(tempj);
}
i -= Lowbit(i);
}
return s;
}
void Inc(int i,int j,int m,int num)

...{
int tempj;
while(i<=num)

...{
tempj = j;
while(tempj<=num)

...{
sum[i][tempj] += m;
tempj += Lowbit(tempj);
}
i += Lowbit(i);
}
}


int main()

...{
int T;
int i, j, k;
int n;
char c;
int x, y, x1, y1,x2, y2, n1;
int index = 1;
scanf("%d", &T);
while (T--)

...{
printf("Case %d: ",index++);
memset(map, 0, sizeof(map));
for (i=1; i<MAX; ++i)

...{
for (j=1; j<MAX; ++j)

...{
map[i][j] = 1;
sum[i][j] = Lowbit(i)*Lowbit(j);
}
}
scanf("%d",&n);
for (i=0; i<n; ++i)

...{
getchar();
scanf("%c", &c);
if(c == 'S')

...{
scanf("%d%d%d%d",&x1, &y1,&x2, &y2);
++x1, ++x2, ++y1, ++y2;
int lx, ly, rx, ry;
if(x1 > x2)
lx = x2, rx = x1;
else
lx = x1, rx = x2;
if(y1 > y2)
ly = y2, ry = y1;
else
ly = y1, ry = y2;
printf("%d ", Getsum(rx, ry)-Getsum(rx, ly-1)-Getsum(lx-1, ry)+Getsum(lx-1, ly-1));
}
else if(c == 'A')

...{
scanf("%d%d%d",&x, &y, &n1);
++x, ++y;
Inc(x, y, n1, MAX-1);
map[x][y] += n1;
}
else if(c == 'D')

...{
scanf("%d%d%d",&x, &y, &n1);
++x, ++y;
if(n1 > map[x][y])
n1 = map[x][y];
Inc(x, y, -n1, MAX-1);
map[x][y] -= n1;
}
else if(c == 'M')

...{
scanf("%d%d%d%d%d",&x1, &y1,&x2, &y2,&n1);
++x1, ++x2, ++y1, ++y2;
if(n1 > map[x1][y1])
n1 = map[x1][y1];
Inc(x1, y1, -n1, MAX-1);
Inc(x2, y2, n1, MAX-1);
map[x1][y1] -= n1;
map[x2][y2] += n1;
}
}

}
return 0;
}