/*
二维树状数组模版题
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int c[1030][1030];
int Row,Col;
inline int Lowbit(const int &x)
{
return x&(-x);
}
int Sum(int i,int j) //计算c[1][1]到c[i][j]矩形区域的和
{
int tempj,sum=0;
while(i>0)
{
tempj=j;
while(tempj>0)
{
sum+=c[i][tempj];
tempj-=Lowbit(tempj);
}
i-=Lowbit(i);
}
return sum;
}
void Update(int i,int j,int num) //将c[i][j]的值加上num,并同步更新父亲节点
{
int tempj;
if(num<0)
num=c[i][j]+num>=0?num:-c[i][j];
while(i<=Row)
{
tempj=j;
while(tempj<=Col)
{
c[i][tempj]+=num;
tempj+=Lowbit(tempj);
}
i+=Lowbit(i);
}
}
int main()
{
int temp,s,cmd;
while(scanf("%d",&cmd)!=EOF)
{
if(cmd==0)
{
scanf("%d",&s);
for(int i=1;i<=s;i++)
for(int j=1;j<=s;j++)
c[i][j]=0;
Col=Row=s;
}
else if(cmd==3)break;
else if(cmd==2)
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++,y1++,x2++,y2++;
printf("%d\n",Sum(x2,y2)-Sum(x1-1,y2)-Sum(x2,y1-1)+Sum(x1-1,y1-1));
//-Sum(x1,y1)
}
else
{
int x,y,a;
scanf("%d%d%d",&x,&y,&a);
x++,y++;
Update(x,y,a);
}
}
}
POJ 1195 二维树状数组
最新推荐文章于 2012-08-06 00:54:35 发布