【POJ 1195 Mobile phones】解题报告

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#define inf 0x3f3f3f3f
#define LL unsigned long long
#define maxn 1025
using namespace std;
int s;
int num[maxn][maxn];
int k,a,b,c,d;
int lowbit(int x){return x&(-x);}
void adde(int x,int y,int add)
{
	for(int i=x;i<=s;i+=lowbit(i))
	{
		for(int j=y;j<=s;j+=lowbit(j))
		{
			num[i][j]+=add;
		}
	}
}
int query(int x,int y)
{
	int ans = 0;
	for(int i=x;i>0;i-=lowbit(i))
	{
		for(int j=y;j>0;j-=lowbit(j))
		{
			ans+=num[i][j];
		}
	}
	return ans;
}
/******Program Begin*********/
int main()
{
	scanf("%d",&s);scanf("%d",&s);
	while(scanf("%d",&k)==1)
	{
		if(k==1)
		{
			scanf("%d%d%d",&a,&b,&c);
			a++,b++;
			adde(a,b,c);
		}
		if(k==2)
		{
			scanf("%d%d%d%d",&a,&b,&c,&d);
			a++,b++,c++,d++;
			printf("%d\n",query(c,d)-query(a-1,d)-query(c,b-1)+query(a-1,b-1));
		}
		if(k==3)break;
	}
	return 0;
}
/*******Program End**********/
裸的二位树状数组

你可能感兴趣的:(算法,poj,树状数组)