#include<iostream> #include<cstring> #include<cstdio> using namespace std; typedef long long ll; ll w[100010],ans; ll n; struct node{ ll st; ll ed; ll sum; ll mark; }a[400050]; void Build_tree(ll x,ll y,ll m) { a[m].st=x;a[m].ed=y; if(x==y) { a[m].sum=w[x]; return ; } ll mid=(x+y)/2; Build_tree(x,mid,m*2); Build_tree(mid+1,y,m*2+1); a[m].sum=a[m*2].sum+a[m*2+1].sum; } void Point_down(ll x) { a[2*x].mark+=a[x].mark; a[2*x+1].mark+=a[x].mark; a[2*x].sum+=a[x].mark*(a[x*2].ed-a[x*2].st+1); a[2*x+1].sum+=a[x].mark*(a[x*2+1].ed-a[2*x+1].st+1); a[x].mark=0; } void Line_change(ll lf,ll rg,ll x,ll y) { if(lf<=a[x].st&&rg>=a[x].ed) { a[x].sum=a[x].sum+(a[x].ed-a[x].st+1)*y; a[x].mark=a[x].mark+y; return ; } if(a[x].mark) Point_down(x); ll mid=(a[x].st+a[x].ed)/2; if(lf<=mid) Line_change(lf,rg,2*x,y); if(rg>mid) Line_change(lf,rg,2*x+1,y); a[x].sum=a[2*x].sum+a[2*x+1].sum; } void Line_que(ll lf,ll rg,ll x) { if(lf<=a[x].st&&rg>=a[x].ed) { ans=ans+a[x].sum; return ; } if(a[x].mark) Point_down(x); ll mid=(a[x].st+a[x].ed)/2; if(lf<=mid) Line_que(lf,rg,x*2); if(rg>mid) Line_que(lf,rg,2*x+1); } int main() { ll q,x,y,z; char ch; scanf("%lld %lld",&n,&q); for(ll i=1;i<=n;i++) scanf("%lld",&w[i]); Build_tree(1,n,1); for(ll i=1;i<=q;i++) { scanf("%s",&ch); if(ch=='Q') { scanf("%lld %lld",&x,&y); ans=0; Line_que(x,y,1); printf("%lld\n",ans); } else { scanf("%lld %lld %lld",&x,&y,&z); Line_change(x,y,1,z); } } }