#include<iostream> #include<string.h> #include<cstdio> long long num[100010]; using namespace std; struct st { int l; int r; long long sum; long long a; } p[400100]; void build(int t,int l,int r) { p[t].l=l; p[t].r=r; if(l==r-1) { p[t].sum=num[l]; return; } int mid=(l+r)/2; build(t*2+1,mid,r); build(t*2,l,mid); p[t].sum=p[t*2].sum+p[t*2+1].sum; } void update(int t,int l,int r,int v) { if(p[t].l==l&&p[t].r==r) { p[t].a += v; p[t].sum += v*(r -l); return ; } if( p[t].a ) { p[2*t+1].a += p[t].a; p[2*t].a += p[t].a; p[2*t+1].sum += p[t].a*(p[2*t+1].r -p[2*t+1].l); p[2*t].sum += p[t].a*(p[2*t].r -p[2*t].l); p[t].a = 0; } int mid = (p[t].l+p[t].r)/2; if( l >= mid ) update(2*t+1,l,r,v); else if( r <= mid ) update(2*t,l,r,v); else { update(2*t,l,mid,v); update(2*t+1,mid,r,v); } p[t].sum = p[2*t].sum + p[2*t+1].sum; } long long query(int t,int l,int r) { if(p[t].l == l && p[t].r == r ) return p[t].sum; if( p[t].a ) { p[2*t+1].a += p[t].a; p[2*t].a += p[t].a; p[2*t+1].sum +=p[t].a*(p[2*t+1].r - p[2*t+1].l); p[2*t].sum += p[t].a*(p[2*t].r - p[2*t].l); p[t].a = 0; } int mid =(p[t].l+p[t].r)/2; if( l >= mid ) return query(2*t+1,l,r); else if( r <= mid ) return query(2*t,l,r); else return query(2*t,l,mid) + query(2*t+1,mid,r); } int main() { int n,q; while(scanf("%d%d",&n,&q)!=EOF) { for(int i=0; i<n; i++) scanf("%lld",&num[i]); memset(p,0,sizeof(p)); build(1,0,n+1); getchar(); for(int i=0; i<q; i++) { char c; scanf("%c",&c); if(c=='Q') { int x,y; scanf("%d%d",&x,&y); getchar(); printf("%lld ",query(1,x-1,y)); } else if(c=='C') { int x,y,z; scanf("%d%d%d",&x,&y,&z); getchar(); update(1,x-1,y,z); } } } return 0; }