poj 1195 二维树状数组(单点更新)

题意:在一个矩阵中做一些add和query操作   。  二维树状数组裸题


矩阵sum(x1,y1,x2,y2) = sum(0,0,x2,y2) - sum(0,0,x1-1,y2, ) - sum(0,0,x2,y1-1) + sum(x1-1,y1-1); 


#include

#include
#include
#include
#define lson l,mid,rt<<1 
#define rson mid + 1,r,rt<<1|1
using namespace std;
const int maxn = 1e3 + 100;
int BIT[maxn][maxn],n;
void add(int x,int y,int v)
{
	for(int i = x;i <= n; i += i&-i)
	{
		for(int j = y; j <= n; j += j&-j)
		{
			BIT[i][j] += v;
		}
	}
} 
int sum(int x,int y)
{
	int res = 0;
	for(int i = x; i ; i -= i&-i)
	{
		for(int j = y; j ; j -= j&-j)
		{
			res += BIT[i][j];
		}
	}
	return res;
}
int main(void)
{
	int type,x0,y0,x1,y1,a ;
	while(~scanf("%d",&type)&&type!=3)
	{
		if(type == 0)	
		{
			scanf("%d",&n);
			memset(BIT,0,sizeof(BIT));
		}
		else if(type == 1)
		{
			scanf("%d %d %d",&x0,&y0,&a);
			add(x0+1,y0+1,a);
		}
		else
		{
			scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
			printf("%d\n",sum(x1 + 1, y1 + 1) - sum(x0, y1 + 1) - sum(x1 + 1 , y0) + sum(x0,y0));
		}
	}
	return 0;
}


你可能感兴趣的:(线段树)