记录编号 |
356956 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[IOI 2001] 移动电话 |
最终得分 |
100 |
用户昵称 |
sxysxy |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.169 s |
提交时间 |
2016-12-07 20:10:54 |
内存使用 |
4.31 MiB |
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstring>
#include <string>
#include <list>
#include <queue>
#include <vector>
using namespace std;
#define MAXS 1026
int mp[MAXS][MAXS];
int S;
void add2(int *s, int x, int v)
{
for(; x <= S; x += x&-x)
s[x] += v;
}
void add1(int x, int y, int v)
{
for(; x <= S; x += x&-x)
add2(mp[x], y, v);
}
int ask2(int *s, int x)
{
int r = 0;
for(; x > 0; x -= x&-x)
r += s[x];
return r;
}
int ask1(int x, int y)
{
int r = 0;
for(; x > 0; x -= x&-x)
r += ask2(mp[x], y);
return r;
}
int main()
{
freopen("mobilephones.in", "r", stdin);
freopen("mobilephones.out", "w", stdout);
int op;
scanf("%d %d", &op, &S);
while(true)
{
scanf("%d", &op);
if(op == 3)break;
else if(op == 1)
{
int x, y, a;
scanf("%d %d %d", &x, &y, &a);
x++, y++;
add1(x, y, a);
}else if(op == 2)
{
int l, b, r, t;
scanf("%d %d %d %d", &l, &b, &r, &t);
l++, b++, r++, t++;
printf("%d\n", ask1(r, t)-ask1(l-1, t)-ask1(r, b-1)+ask1(l-1, b-1));
}
}
return 0;
}