题目链接
二维树状数组模板题
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=1e3+10;
typedef long long ll;
ll sum[N][N];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int y,int v)
{
for(int i=x;i<=1002;i+=lowbit(i))
for(int j=y;j<=1002;j+=lowbit(j))
sum[i][j]+=v;
}
ll query(int x,int y)
{
ll ans=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
ans+=sum[i][j];
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int t,q,x1,y1,x2,y2;
ll n1;
char op;
scanf("%d",&t);
for(int ca=1;ca<=t;ca++)
{
scanf("%d",&q);
printf("Case %d:\n",ca);
memset(sum,0,sizeof(sum));
for(int i=1;i<=1002;i++)
for(int j=1;j<=1002;j++)
update(i,j,1);
for(int i=1;i<=q;i++)
{
cin>>op;
//scanf("%c",&op);错误
if(op=='S')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++;y1++;x2++;y2++;
if(x1>x2)swap(x1,x2);
if(y1>y2)swap(y1,y2);
printf("%lld\n",query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1));
}
else if(op=='A')
{
scanf("%d%d%lld",&x1,&y1,&n1);
x1++;y1++;
update(x1,y1,n1);
}
else if(op=='D')
{
scanf("%d%d%lld",&x1,&y1,&n1);
x1++;y1++;
ll tmp=query(x1,y1)-query(x1,y1-1)-query(x1-1,y1)+query(x1-1,y1-1);//此处写错
if(tmp>=n1)update(x1,y1,-n1);
else update(x1,y1,-tmp);
}
else if(op=='M')
{
scanf("%d%d%d%d%lld",&x1,&y1,&x2,&y2,&n1);
x1++;y1++;x2++;y2++;
ll tmp=query(x1,y1)-query(x1,y1-1)-query(x1-1,y1)+query(x1-1,y1-1);//此处写错
if(tmp>=n1)
{
update(x1,y1,-n1);
update(x2,y2,n1);
}
else
{
update(x1,y1,-tmp);
update(x2,y2,tmp);
}
}
}
}
return 0;
}