题意:二维的树状数组
注意的有三个地方,
输入进去的坐标都加1,防止lowbit(0) + 0造成死循环
还有就是询问矩形面积的时候,输入进去的x1,x2,y1,y2,可能不是正对角线,要转化成正对角线

初始化的时候,是每个点的值为1

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; int a[][],c[][]; int lowbit(int x){ return x & (-x);} int sum(int x,int y){
int ret=;
for(int i=x;i>;i-=lowbit(i))
for(int j=y;j>;j-=lowbit(j))
ret+=c[i][j]; return ret;
} void add(int x,int y,int d){
for(int i=x;i<;i+=lowbit(i))
for(int j=y;j<;j+=lowbit(j))
c[i][j]+=d;
} void init(){
memset(c,,sizeof(c));
for(int i=;i<;i++){
for(int j=;j<;j++){
add(i,j,);
a[i][j] = ;
}
}
} int main(){
int T;
int kase = ;
scanf("%d",&T);
while(T--){
printf("Case %d:\n",++kase);
init();
int m;
scanf("%d%*c",&m);
while(m--){
char cmd;
scanf("%c",&cmd);
if(cmd == 'S') {
int x,xx,y,yy,x1,x2,y1,y2;
scanf("%d%d%d%d%*c",&x,&y,&xx,&yy);
x++;y++;xx++;yy++;
x1 = min(x,xx);x2 = max(x,xx);
y1 = min(y,yy); y2 = max(y,yy); int ans=;
ans += sum(x1-,y1-);
ans -= sum(x1-,y2);
ans -= sum(x2,y1-);
ans += sum(x2,y2);
printf("%d\n",ans);
} if(cmd == 'A'){
int x1,y1,n1;
scanf("%d%d%d%*c",&x1,&y1,&n1);
x1++;y1++;
a[x1][y1]+=n1;
add(x1,y1,n1);
}
if(cmd == 'D'){
int x1,y1,n1;
scanf("%d%d%d%*c",&x1,&y1,&n1);
x1++;y1++;
n1 = min(n1,a[x1][y1]);
a[x1][y1]-=n1;
add(x1,y1,-n1);
}
if(cmd == 'M'){
int x1,y1,x2,y2,n1;
scanf("%d%d%d%d%d%*c",&x1,&y1,&x2,&y2,&n1);
x1++;y1++;x2++;y2++;
n1=min(n1,a[x1][y1]);
a[x1][y1]-=n1;a[x2][y2]+=n1;
add(x1,y1,-n1);
add(x2,y2,n1);
}
}
}
return ;
}
05-22 10:32