POJ 1195 二维树状数组

/*
二维树状数组模版题
*/
#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 二维树状数组)