POJ

来源:互联网 发布:天盾苹果手机数据恢复软件 编辑:程序博客网 时间:2024/06/04 18:52
#include<stdio.h>long long s[400005],a[100005];long long addlazy[400005];void pushdown(long long id,long long ll,long long rr){    long long mid=(ll+rr)>>1;    long long ls=id*2,rs=id*2+1;    addlazy[ls]+=addlazy[id];    addlazy[rs]+=addlazy[id];    s[ls]+=(mid-ll+1)*addlazy[id];    s[rs]+=(rr-mid)*addlazy[id];    addlazy[id]=0;}void build(long long id,long long ll,long long rr){    addlazy[id]=0;    if(ll==rr){        s[id]=a[ll];        return;    }    long long mid= (ll+rr)>>1;    build(id*2,ll,mid);    build(id*2+1,mid+1,rr);    s[id]=s[id*2]+s[id*2+1];}long long QuerySum(long long id,long long ll,long long rr,long long l,long long r){    if(l<=ll&rr<=r){        return s[id];    }    long long mid=(ll+rr)>>1;pushdown(id,ll,rr);    if(r<=mid)        return QuerySum(id*2,ll,mid,l,r);    else if(l>mid)        return QuerySum(id*2+1,mid+1,rr,l,r);    else        return QuerySum(id*2,ll,mid,l,r)+QuerySum(id*2+1,mid+1,rr,l,r);}void updataAdd(long long id,long long ll,long long rr,long long l,long long r,long long add){    if(l<=ll&rr<=r){        s[id]+=(rr-ll+1)*add;        addlazy[id]+=add;        return;    }    pushdown(id,ll,rr);    long long mid=(ll+rr)>>1;    if(r<=mid)        updataAdd(id*2,ll,mid,l,r,add);    else if(l>mid)        updataAdd(id*2+1,mid+1,rr,l,r,add);    else{        updataAdd(id*2,ll,mid,l,r,add);        updataAdd(id*2+1,mid+1,rr,l,r,add);    }    s[id]=s[id*2]+s[id*2+1];}int main(){    long long n,q;    while(~scanf("%lld%lld",&n,&q)){        for(long long i=1;i<=n;i++)            scanf("%lld",a+i);        build(1,1,n);        while(q--){            char w[4];            scanf("%s",w);            if(w[0]=='Q'){                long long l,r;                scanf("%lld%lld",&l,&r);                printf("%lld\n",QuerySum(1,1,n,l,r));            }            if(w[0]=='C'){                long long l,r,c;                scanf("%lld%lld%lld",&l,&r,&c);                updataAdd(1,1,n,l,r,c);            }        }        return 0;    }}