记录编号 375616 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 数列操作C 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 1.368 s
提交时间 2017-02-25 16:50:10 内存使用 6.39 MiB
显示代码纯文本
#include<cstdio>
typedef long long ll;
const int maxn=100005;
ll sum[maxn<<2],mark[maxn<<2];
void build(int rt,int l,int r){
    if(l==r){
        scanf("%lld",&sum[rt]);return;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];   
}
void pushdown(int rt,int l,int r){
    if(mark[rt]){
        mark[rt<<1]+=mark[rt];mark[rt<<1|1]+=mark[rt];
        int mid=(l+r)>>1;
        sum[rt<<1]+=mark[rt]*(mid-l+1);sum[rt<<1|1]+=mark[rt]*(r-mid);
        mark[rt]=0;
    }
}
void Add(int rt,int l,int r,const int &L,const int &R,const ll &x){
    if(L<=l&&r<=R){
        sum[rt]+=(r-l+1)*x;
        mark[rt]+=x;
        return;
    }
    pushdown(rt,l,r); 
    int mid=(l+r)>>1;
    if(L<=mid)Add(rt<<1,l,mid,L,R,x);
    if(R>mid)Add(rt<<1|1,mid+1,r,L,R,x);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
ll Query(int rt,int l,int r,const int &L,const int &R){
    if(L<=l&&r<=R){
        return sum[rt];
    }
    pushdown(rt,l,r);
    int mid=(l+r)>>1;ll ans=0;
    if(L<=mid)ans+=Query(rt<<1,l,mid,L,R);
    if(R>mid)ans+=Query(rt<<1|1,mid+1,r,L,R);
    return ans;
}
int main(){
    freopen("shuliec.in","r",stdin);
    freopen("shuliec.out","w",stdout);
    int n;scanf("%d",&n);
    build(1,1,n);
    char buf[10];
    int m;scanf("%d",&m);
    int l,r;ll x;
    while(m--){
        scanf("%s",buf);
        if(buf[0]=='A'){
            scanf("%d%d%lld",&l,&r,&x);
            Add(1,1,n,l,r,x);
        }else{
            scanf("%d%d",&l,&r);
            printf("%lld\n",Query(1,1,n,l,r));
        }
    }
    fclose(stdin);fclose(stdout);
    return 0;
}