#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <algorithm>#include <iostream>#include <cstdio>#include <cstring>#define MAXN 100005#define LC(x) ((x) << 1) #define RC(x) ((x) << 1 | 1) #define Mid(x,y) (((x) + (y)) >> 1)#define Min(a,b) ((a) < (b) ? (a) : (b))#define Max(a,b) ((a) > (b) ? (a) : (b))long long int sum[MAXN<<2],dlt[MAXN<<2];int lft[MAXN<<2],rht[MAXN<<2];long long int init_v[MAXN+10];using namespace std; void pushdown(int rt){ if(dlt[rt]){ dlt[LC(rt)]+=dlt[rt]; sum[LC(rt)]+=(rht[LC(rt)]-lft[LC(rt)]+1)*dlt[rt]; //width*height dlt[RC(rt)]+=dlt[rt]; sum[RC(rt)]+=(rht[RC(rt)]-lft[RC(rt)]+1)*dlt[rt]; dlt[rt]=0; }}void pushup(int rt){ sum[rt] = sum[LC(rt)] + sum[RC(rt)];}void update(int rt,int start,int end,long long int delta){ if(start<=lft[rt]&&end>=rht[rt]){ dlt[rt]+=delta; sum[rt] += (rht[rt]-lft[rt]+1)*delta; return; } pushdown(rt);// 顺便将之前未更新到儿子的信息pushdown if(start<=rht[LC(rt)]) update(LC(rt),start,end,delta); //要更新的区间和左儿子有交集(区间左界<=左儿子右界) if(end>=lft[RC(rt)]) update(RC(rt),start,end,delta); //要更新的区间和右儿子有交集 pushup(rt);//返回时候更新当前节点} void build(int rt,int l,int r){ lft[rt]=l; rht[rt]=r; dlt[rt]=0; if(l==r){ sum[rt]=init_v[l]; return; } else{ build(LC(rt),l,Mid(l,r)); build(RC(rt),Mid(l,r)+1,r); pushup(rt); return; } }long long int query(int rt,int start,int end){ if(start>rht[rt]||end<lft[rt]) return 0;//如果当前节点在查询的范围内就直接返回 if(start<=lft[rt]&&end>=rht[rt]) return sum[rt]; pushdown(rt);//顺便更新之前的标记// if(start>=lft[RC(rt)]) //区间只和右儿子有交集 区间左界大于等于右儿子左界// return query(RC(rt),start,end);// else// if(end<=rht[LC(rt)]) //区间只和左儿子有集交// return query(LC(rt),start,end);// else //左右儿子都有交集 return query(LC(rt),start,end) + query(RC(rt),start,end);} int main(int argc, char *argv[]){ int n,q,i,j,start,end; long long int delta; char ch[2]; while(scanf("%d%d",&n,&q)!=EOF) { for(i=1;i<=n;i++) scanf("%lld",init_v+i); build(1,1,n); while(q--) { scanf("%s",ch); if(ch[0]=='C') { scanf("%d%d%lld",&start,&end,&delta); update(1,start,end,delta); } else { scanf("%d%d",&start,&end); printf("%lld\n",query(1,start,end)); } } return 0; }}