| 比赛 | EYOI暨SBOI暑假快乐赛3rd | 评测结果 | AAAAAAAAAA | 
    | 题目名称 | 移动电话 | 最终得分 | 100 | 
    | 用户昵称 | ZRQ | 运行时间 | 0.117 s | 
    | 代码语言 | C++ | 内存使用 | 41.95 MiB | 
    | 提交时间 | 2022-06-27 11:33:56 | 
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
const int S=2050;
struct node
{
    int l,r,a[S];
}t[4*S];
int s,op,x,y,a,l,r;
void add(int rt,int i,int k)
{
    while(i<=s) t[rt].a[i]+=k,i+=i&-i;
    return ; 
}
int ask(int rt,int x)
{
    int res=0;
    while(x) res+=t[rt].a[x],x-=x&-x;
    return res;
}
void build(int rt,int l,int r)
{
    t[rt].l=l,t[rt].r=r;
    if(l==r) return;
    int mid=l+r>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    return ;
 } 
void updata(int rt,int x,int y,int k)
{
    if(t[rt].l<=x&&t[rt].r>=x) add(rt,y,k);
    if(t[rt].l==t[rt].r) return ;
    int mid=(t[rt].l+t[rt].r)>>1;
    if(x<=mid) updata(rt<<1,x,y,k);
    else if(x>mid) updata(rt<<1|1,x,y,k);
    return ;
}
int ask(int rt,int l,int x,int r,int y)
{
    if(t[rt].l==l&&t[rt].r==r) return ask(rt,y)-ask(rt,x-1);
    int mid=(t[rt].l+t[rt].r)>>1;
    if(r<=mid) return ask(rt<<1,l,x,r,y);
    else if(l>mid) return ask(rt<<1|1,l,x,r,y);
    else return ask(rt<<1,l,x,mid,y)+ask(rt<<1|1,mid+1,x,r,y);
}
int main()
{
    freopen("mobilephones.in","r",stdin);
    freopen("mobilephones.out","w",stdout);
    while(scanf("%d",&op)&&op!=3)
    {
        if(op==0) scanf("%d",&s),build(1,1,s);
        else if(op==1) scanf("%d%d%d",&x,&y,&a),updata(1,x+1,y+1,a);
        else if(op==2) scanf("%d%d%d%d",&l,&x,&r,&y),printf("%d\n",ask(1,l+1,x+1,r+1,y+1));
        else break;
    }
    return 0;
}