主要涉及二维树状数组查询和修改
直接看代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int c[1200][1200],n;
int ask(int x,int y)//
{
int ans=0;
for(int i=x;i>=1;i-=i&-i)
for(int j=y;j>=1;j-=j&-j)
ans+=c[i][j];
return ans;
}
void add(int x,int y,int z)
{
for(int i=x;i<=n;i+=i&-i)
for(int j=y;j<=n;j+=j&-j)
c[i][j]+=z;
}
int main()
{
int T;
while(cin>>T)
{
if(T==0)
cin>>n;
else if(T==1)
{
int x,y,val;
scanf("%d%d%d",&x,&y,&val);
x++,y++;
add(x,y,val);
}
else if(T==2)
{
int l,b,r,t;
scanf("%d%d%d%d",&l,&b,&r,&t);
l++,b++,r++,t++;
cout<<ask(r,t)-ask(l-1,t)-ask(r,b-1)+ask(l-1,b-1)<<endl;//二维前缀和
}
else
{
memset(c,0,sizeof(c));
break;
}
}
return 0;
}