Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 6658 | Accepted: 2809 |
Description
Write a program, which receives these reports and answers queries about the current total number of active mobile phones in any rectangle-shaped area.
Input

The values will always be in range, so there is no need to check them. In particular, if A is negative, it can be assumed that it will not reduce the square value below zero. The indexing starts at 0, e.g. for a table of size 4 * 4, we have 0 <= X <= 3 and 0 <= Y <= 3.
Table size: 1 * 1 <= S * S <= 1024 * 1024
Cell value V at any time: 0 <= V <= 32767
Update amount: -32768 <= A <= 32767
No of instructions in input: 3 <= U <= 60002
Maximum number of phones in the whole table: M= 2^30
Output
Sample Input
0 4 1 1 2 3 2 0 0 2 2 1 1 1 2 1 1 2 -1 2 1 1 2 3 3
Sample Output
3 4
Source
#include<stdio.h>
int k,s;
int tree[1025][1025];
inline int Lowbit(int x)
{
return x&(-x);
}
void Update(int x,int y,int c)
{
for(int i=x;i<=s;i+=Lowbit(i))
for(int j=y;j<=s;j+=Lowbit(j))
tree[i][j]+=c;
}
int Getsum(int x,int y)
{
int temp=0;
for(int i=x;i>0;i-=Lowbit(i))
for(int j=y;j>0;j-=Lowbit(j))
temp+=tree[i][j];
return temp;
}
int main()
{
while(scanf("%d%d",&k,&s)!=EOF)
{
while((scanf("%d",&k),k)!=3)
{
if(k==1)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
Update(x+1,y+1,c);
}
else
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d/n",Getsum(x2+1,y2+1)-Getsum(x1,y2+1)-Getsum(x2+1,y1)+Getsum(x1,y1));
}
}
}
return 0;
}