#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;
}
}
POJ - 3468 A Simple Problem with Integers
最新推荐文章于 2022-08-28 01:34:07 发布