| Time Limit: 5000MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
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
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define MAXN 1300 int c[MAXN][MAXN]; int n; int lowbit(int x) { return x&(-x); } void updata(int x,int y,int value) { int i,j; for(i=x;i<=n;i+=lowbit(i)) for(j=y;j<=n;j+=lowbit(j)) c[i][j]+=value; } int query(int x,int y) { int i,j; int sum=0; for(i=x;i>0;i-=lowbit(i)) for(j=y;j>0;j-=lowbit(j)) { sum+=c[i][j]; } return sum; } int main() { int t; while(scanf("%d",&t)!=EOF) { if(t==0) { scanf("%d",&n); memset(c,0,sizeof(c)); } else if(t==1) { int x,y,val; scanf("%d%d%d",&x,&y,&val); updata(x+1,y+1,val); } else if(t==2) { int ans; int x1,y2,x2,y1; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); ans=query(x1,y1)+query(x2+1,y2+1)-query(x1,y2+1)-query(x2+1,y1); printf("%d\n",ans); } else if(t==3)break; } return 0; }
290



被折叠的 条评论
为什么被折叠?



