poj 1195 Mobile phones

// 题意: n*n的矩阵 ,定义两种操作:
// (1) x y a : [x,y]的值加上a (2) x1 y1 x2 y2 : 查询子矩阵[x1,y1] -[x2,y2]的和

#include <iostream> //简单二维树状数组
using namespace std;

int C[1025][1025]; //树状数组初始化为0
int side;

int lowbit(int x)
{
return x&(-x);
}
void modify(int x,int y,int a)
{
x++;y++; //让数组下标从 1 开始
while(x<=side)

{
int j=y;
while(j<=side)
{
C[x][j]+=a;
j+=lowbit(j);
}
x+=lowbit(x);
}
}
int sum(int x,int y)
{
x++;y++;
int s=0;
while(x>0)
{
int j=y;
while(j>0)
{
s+=C[x][j];
j-=lowbit(j);
}
x-=lowbit(x);
}
return s;
}
int main()
{
int op,ans;
while(scanf("%d",&op)&&op!=3)
{
switch (op)
{
case 0:
scanf("%d",&side);
break;
case 1:
int x,y,a;
scanf("%d%d%d",&x,&y,&a);
modify(x,y,a);
break;
case 2:
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
ans=sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1);
printf("%d\n",ans);
break;
default:
break;
}
}
return 0;
}

posted on 2011-07-22 16:15  sysu_mjc  阅读(119)  评论(0编辑  收藏  举报

导航