原文:http://blog.acmj1991.com/?p=665
题意:给你一个s*s的坐标图,每个坐标都代表这一个区域,坐标区域内手机信号的数量可能会改变,当给你一个坐标时表示坐标点区域内数量变化。当给你两个坐标时表示求两坐标形成矩阵内的手机信号总数
思路:二维树状数组
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define maxN 1050
int map[maxN][maxN];
int lowbit(int x){return x&(-x);}
int getsum(int x,int y)
{
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
sum+=map[i][j];
return sum;
}
int main()
{
int n,s,x,y,a,b;
while(scanf("%d",&s)&&s!=3)
{
if(s==0)scanf("%d",&n);
else if(s==1){
scanf("%d%d%d",&x,&y,&a);
x++,y++;
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
map[i][j]+=a;
}
else{
scanf("%d%d%d%d",&x,&y,&a,&b);
x++,y++,a++,b++;
printf("%d\n",getsum(x-1,y-1)+getsum(a,b)-getsum(a,y-1)-getsum(x-1,b));
}
}
}