这题的重点是如何结合二维数组与数状数组。其实根据二个向量维度互不干扰的原理可以写出下面代码。
#include<stdio.h>
#include<string.h>
#define maxn 1100
int c[maxn][maxn],ans,n;
int lowbit(int i)
{return i&(-i);}
void update(int x,int y,int val)
{
for(int i=x;i<=maxn;i+=lowbit(i))
for(int j=y;j<=maxn;j+=lowbit(j))
c[i][j]+=val;
}
int sum(int x,int y)
{
int s=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
s+=c[i][j];
return s;
}
int main()
{
int s,x,y,a,l,b,r,t,encode;
while(~scanf("%d%d",&encode,&s)&&!encode)
{
memset(c,0,sizeof(c));
while(1)
{
scanf("%d",&encode);
if(encode==3)break;
else if(encode==1)
{
scanf("%d%d%d",&x,&y,&a);
x++;y++;
update(x,y,a);
}
else if(encode==2)
{
scanf("%d%d%d%d",&l,&b,&r,&t);
l++;b++;r++;t++;
ans=sum(r,t)-sum(l-1,t)-sum(r,b-1)+sum(l-1,b-1);
printf("%d\n",ans);
}
}
}
return 0;
}