Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 19786 | Accepted: 9133 |
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<iostream> #include<cstdio> #include<cstring> using namespace std; int a,x,y,k,l,r,b,t,s; int sz[1100][1100]; int lowbit(int x) { return x&-x; } void add(int x,int y,int k) { for(int i=x;i<=s;i+=lowbit(i)) for(int j=y;j<=s;j+=lowbit(j)) sz[i][j]+=k; } int sum(int x,int y) { int ans=0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) ans+=sz[i][j]; return ans; } int main() { while(scanf("%d",&a)!=EOF) { if(a==0){ scanf("%d",&s); memset(sz,0,sizeof(0)); } if(a==1) { scanf("%d%d%d",&x,&y,&k); add(x+1,y+1,k); } if(a==2) { scanf("%d%d%d%d",&l,&b,&r,&t); printf("%d\n",sum(r+1,t+1)-sum(l,t+1)-sum(r+1,b)+sum(l,b)); } if(a==3)break; } return 0; }