const int N=1e5+5;
int n,m,t;
int i,j,k;
int a[N];
struct Node
{
int l, r;
ll sum,lazy;
void update(int x)
{
sum+=1ll*(r-l+1)*x;
lazy+=x;
}
}node[N<<2];
void push_up(int id)
{
node[id].sum=node[id<<1].sum+node[id<<1|1].sum;
}
void push_down(int id)
{
ll x=node[id].lazy;
if(x){
node[id<<1].update(x);
node[id<<1|1].update(x);
node[id].lazy=0;
}
}
void build(int l,int r,int id)
{
node[id].l=l,node[id].r=r;
node[id].lazy=node[id].sum=0;
if(l==r){
node[id].sum=a[l];
return ;
} else{
int mid=l+r>>1;
build(l,mid,id<<1);
build(mid+1,r,id<<1|1);
push_up(id);
}
}
void update(int l,int r,ll val,int id)
{
int L=node[id].l,R=node[id].r;
if(L>=l && r>=R){
node[id].update(val);
} else{
int mid=L+R>>1;
push_down(id);
if(mid>=l) update(l,r,val,id<<1);
if(r>=mid+1) update(l,r,val,id<<1|1);
push_up(id);
}
}
ll query(int l,int r,int id)
{
int L=node[id].l,R=node[id].r;
if(L>=l && r>=R){
return node[id].sum;
} else{
int mid=L+R>>1;
push_down(id);
ll ans=0;
if(mid>=l) ans+=query(l,r,id<<1);
if(r>=mid+1) ans+=query(l,r,id<<1|1);
push_up(id);
return ans;
}
}
int main()
{
//IOS;
while(~sdd(n,m)){
for(i=1;i<=n;i++) sd(a[i]);
build(1,n,1);
int l,r,x;
char tag[5];
while(m--){
ss(tag);
if(tag[0]=='C'){
sddd(l,r,x);
update(l,r,x,1);
} else if(tag[0]=='Q'){
sdd(l,r);
//dbg( query(l,r,1) );
pll( query(l,r,1) );
}
}
break;
}
//PAUSE;
return 0;
}