题目链接:http://poj.org/problem?id=1195
题目大意:单点更新,区间求和,注意下标是从0开始的,先加1避免死循环
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1035
int s[N][N];
int lowbit(int x)
{
return x&(-x);
}
void insert(int x,int y,int v)
{
for(int i=x; i<N; i+=lowbit(i))
for(int j=y; j<N; j+=lowbit(j))
s[i][j]+=v;
}
int get_sum(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+=s[i][j];
return sum;
}
int main()
{
int a,n,m,v,a1,b1,a2,b2;
scanf("%d%d",&a,&n);
memset(s,0,sizeof(s));
while(~scanf("%d",&m)&&m!=3)
{
if(m==2)
{
scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
a1++;a2++;b1++;b2++;
int ans=get_sum(a2,b2)-get_sum(a1-1,b2)-get_sum(a2,b1-1)+get_sum(a1-1,b1-1);
printf("%d\n",ans);
}
else
{
scanf("%d%d%d",&a1,&b1,&v);
insert(a1+1,b1+1,v);
}
}
return 0;
}