Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 17005 | Accepted: 7841 |
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
恩题目大意就是说,0 S 为初始化一个 S*S 的矩阵全为0 ,然后1 x y a 为 arr[ x][ y] 加 a 然后 2 l b r t 为在 l , b 与 r , t 的矩形中的和,然后这题貌似只有一组测试数据,注意题目中所给数字的矩阵都是下标从0开始的
#include <iostream>
#include<cstdio>
#include<cstring>
#define maxn 1100
#define ll long long
using namespace std;
int n,c[maxn][maxn];
int lowbit(int t)
{
return t&(t^(t-1));
}
void update(int x,int y,int a)
{
for(int i=x;i<=n;i+=lowbit(i))
{
for(int j=y;j<=n;j+=lowbit(j))
c[i][j]+=a;
}
}
ll sum(int x,int y)
{
ll ans=0;
for(int i=x;i>0;i-=lowbit(i))
{
for(int j=y;j>0;j-=lowbit(j))
ans+=c[i][j];
}
return ans;
}
int main()
{
int o,x,y,a,l,b,r,t;
while(scanf("%d",&o))
{
if(o==0)
{
scanf("%d",&n);
memset(c,0,sizeof(c));
}
else if(o>=3)
break;
else if(o==1)
{
scanf("%d%d%d",&x,&y,&a);
x++,y++;
update(x,y,a);
}
else
{
scanf("%d%d%d%d",&l,&b,&r,&t);
l++,b++,r++,t++;
ll tem=0;
tem=sum(r,t)+sum(l-1,b-1)-sum(r,b-1)-sum(l-1,t);
printf("%lld\n",tem);
}
}
return 0;
}