比赛 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;
}