二维树状数组的简单操作:
Memory: 8736K Time: 1141MS
Language: G++ Result: Accepted
Source Code
#include "stdio.h"
#include "string.h"
long long C[1030][1030];
int n;
int lowbit(int x)
{
return x&(x^(x-1));
}
void Add(int x,int y,int t)
{
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
C[i][j]+=t;
}
long long Sum(int x,int y)
{
long long sum=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
sum+=C[i][j];
return sum;
}
int main()
{
int x,y,x1,y1,r,a;
long long result;
while(scanf("%d",&r)&&r!=3)
{
if(r==0)
{
scanf("%d",&n);
memset(C,0,sizeof(C));
}
if(r==1)
{
scanf("%d%d%d",&x,&y,&a);
Add(x+1,y+1,a);
}
if(r==2)
{
scanf("%d%d%d%d",&x,&y,&x1,&y1);
result=Sum(x1+1,y1+1)-Sum(x1+1,y)-Sum(x,y1+1)+Sum(x,y);
printf("%lld/n",result);
}
}
return 0;
}