题目:http://poj.org/problem?id=1195
题意:给你N*N的矩阵,修改点,查矩阵的和。
分析:很裸的题了。。。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1048;
int tree[maxn][maxn],lowbit[maxn];
void Init()
{
for(int i=1;i<maxn;i++)
lowbit[i]=(i&-i);
}
void update(int x,int y,int c)
{
for(int i=x;i<maxn && i;i+=lowbit[i])
for(int j=y;j<maxn && j;j+=lowbit[j])
tree[i][j]+=c;
}
int query(int x,int y)
{
int ret(0);
for(int i=x;i>0;i-=lowbit[i])
for(int j=y;j>0;j-=lowbit[j])
ret+=tree[i][j];
return ret;
}
int main()
{
int N,q,R,T,L,B,x,y,v;
Init();
while(1)
{
scanf("%d",&q);
if(q==1)
{
scanf("%d%d%d",&x,&y,&v);
x++,y++;
update(x,y,v);
}
else if(q==2)
{
scanf("%d%d%d%d",&L,&B,&R,&T);
L++,B++,R++,T++;
printf("%d\n",query(R,T)-query(L-1,T)-query(R,B-1)+query(L-1,B-1));
}
else if(q==3)
return 0;
else
{
scanf("%d",&N);
for(int i=1;i<=N+3;i++)
memset(tree[i],0,sizeof(tree[0][0])*(N+3));
}
}
return 0;
}