题意:现对矩阵进行以下操作。0,将一个方阵初始化为全0。1,某个位置的数加上一个值。2,询问某个区域的数字和。要求对每个询问求出其和。
使用二维树状数组即可Matrix(x1, y1, x2, y2) = Sum(x2, y2) + Sum(x1-1, y1-1) – Sum(x2, y1-1) – Sum(x1-1, y2)
#include<cstdio>
#include<cstring>
const int n_max=1056;
int a[n_max][n_max];
int n;
void insert(int x,int y,int t)
{
while(x<=n)
{
int temp=y;
while(temp<=n)
{
a[x][temp]+=t;
temp+=temp&(-temp);
}
x+=x&(-x);
}
}
int sum(int x,int y)
{
int ret=0;
while(x>0)
{
int temp=y;
while(temp>0)
{
ret+=a[x][temp];
temp-=temp&(-temp);
}
x-=x&(-x);
}
return ret;
}
int main()
{
int op;
while(true)
{
scanf("%d",&op);
if(op==3)
{
break;
}
else if(op==0)
{
scanf("%d",&n);
n++;
memset(a,0,sizeof(a));
}
else if(op==1)
{
int x,y,t;
scanf("%d%d%d",&x,&y,&t);
insert(x+1,y+1,t);
}
else if(op==2)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
int prt=sum(x2+1,y2+1)-sum(x2+1,y1)-sum(x1,y2+1)+sum(x1,y1);
printf("%d\n",prt);
}
}
return 0;
}