#include<iostream>
using namespace std;
const long long Maxn=1e5+10;
typedef long long ll;
struct Tree{
ll l;
ll r;
ll sum;
ll lz;
Tree():sum(0),lz(0){};
};
Tree t[4*Maxn];
ll a[Maxn];
void lazy(ll k,ll v){
t[k].sum=t[k].sum+v*(t[k].r-t[k].l+1);
t[k].lz+=v;
}
void pushdown(ll k,ll v){
lazy(k<<1,v);
lazy((k<<1)|1,v);
t[k].lz=0;
}
void Build(ll k,ll l,ll r){
t[k].l=l;
t[k].r=r;
if(l==r){
t[k].sum=a[l];
return ;
}
int mid=(l+r)/2;
ll lc=k<<1;
ll rc=(k<<1)|1;
Build(lc,l,mid);
Build(rc,mid+1,r);
t[k].sum=t[lc].sum+t[rc].sum;
}
ll quary(ll k,ll l,ll r){
if(t[k].l>=l&&t[k].r<=r){
return t[k].sum;
}
if(t[k].lz!=0)pushdown(k,t[k].lz);
ll mid=(t[k].l+t[k].r)/2;
ll ans=0;
ll lc=k<<1;
ll rc=(k<<1)|1;
if(mid>=l)ans+=quary(lc,l,r);
if(mid<r)ans+=quary(rc,l,r);
return ans;
}
void update(ll k,ll l,ll r,ll v){
if(t[k].l>=l&&t[k].r<=r){
lazy(k,v);
return ;
}
if(t[k].lz!=0)pushdown(k,t[k].lz);
ll mid=(t[k].l+t[k].r)/2;
ll lc=k<<1;
ll rc=(k<<1)|1;
if(mid>=l)update(lc,l,r,v);
if(mid<r)update(rc,l,r,v);
t[k].sum=t[lc].sum+t[rc].sum;
}
int main()
{
ll n,q;
scanf("%lld%lld",&n,&q);
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
Build(1,1,n);
while(q--){
char ch;
ll f,g,c;
getchar();
scanf("%c",&ch);
if(ch=='Q'){
scanf("%lld%lld",&f,&g);
printf("%lld\n",quary(1,f,g));
}
else if(ch=='C'){
scanf("%lld%lld%lld",&f,&g,&c);
update(1,f,g,c);
}
}
return 0;
}
阜师大一定能打入ACM!!!!!!!!!!!!!!!!!
07-16
07-16
07-16
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交