题目:
题意:
一个n*n的正方形,可以给任何一个区域增加和减少值,求二维前缀和
题解:
二维树状数组
代码:
#include <cstdio>
#include <cstring>
using namespace std;
int n,cc[1030][1030];
void add(int x,int y,int value)
{
int i,j;
for (i=x;i<=n;i+=i&(-i))
for (j=y;j<=n;j+=j&(-j))
cc[i][j]+=value;
}
int qurry(int x,int y)
{
int ans=0,i,j;
for (i=x;i>0;i-=i&(-i))
for (j=y;j>0;j-=j&(-j))
ans+=cc[i][j];
return ans;
}
int main()
{
int a,b,c,d,id;
while (~scanf("%d",&id) && id!=3)
{
switch (id)
{
case 0:scanf("%d",&n); memset(cc,0,sizeof(cc));break;
case 1:scanf("%d%d%d",&a,&b,&c); add(a+1,b+1,c); break;
case 2:scanf("%d%d%d%d",&a,&b,&c,&d); printf("%d\n",qurry(c+1,d+1)-qurry(c+1,b)-qurry(a,d+1)+qurry(a,b)); break;
}
}
}