记录编号 356956 评测结果 AAAAAAAAAA
题目名称 [IOI 2001] 移动电话 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 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;
}