区间修改
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 100010;
struct tree{
int l,r;
long long sum,lz;
}a[MAXN<<2];
long long value[MAXN];
void Pushup(int k){
a[k].sum=a[k<<1].sum+a[k<<1|1].sum;
}
void Pushdown(int k){
if(a[k].lz){
a[k<<1].sum+=(a[k<<1].r-a[k<<1].l+1)*a[k].lz;
a[k<<1|1].sum+=(a[k<<1|1].r-a[k<<1|1].l+1)*a[k].lz;
a[k<<1].lz+=a[k].lz;
a[k<<1|1].lz+=a[k].lz;
a[k].lz=0;
}
}
void Build(int l,int r,int k){
a[k].l=l,a[k].r=r,a[k].lz=0;
if(l==r){
a[k].sum=value[l];
}
else{
int mid=(l+r)>>1;
Build(l,mid,k<<1);
Build(mid+1,r,k<<1|1);
Pushup(k);
}
}
void insertp(int l,int r,int num,int k){
if(a[k].l == l && a[k].r ==r){
a[k].sum+=(r-l+1)*num;
a[k].lz+=num;
}
else{
Pushdown(k);
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) insertp(l,r,num,k<<1);
else if(l>mid) insertp(l,r,num,k<<1|1);
else{
insertp(l,mid,num,k<<1);
insertp(mid+1,r,num,k<<1|1);
}
Pushup(k);
}
}
long long query(int l,int r,int k)
{
if(a[k].l ==l && a[k].r==r){
return a[k].sum;
}
else{
Pushdown(k);
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) return query(l,r,k<<1);
else if(l>mid) return query(l,r,k<<1|1);
else {
return query(l,mid,k<<1)+query(mid+1,r,k<<1|1);
}
}
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++){
scanf("%lld",&value[i]);
}
Build(1,n,1);
for(int i=0;i<m;i++){
char c;
scanf(" %c",&c);
if(c=='C'){
int l,r,num;
scanf("%d%d%d",&l,&r,&num);
if(l>r) swap(l,r);
insertp(l,r,num,1);
}
else if(c=='Q'){
int x,y;
scanf("%d%d",&x,&y);
if(x>y) swap(x,y);
long long ans=0;
ans=query(x,y,1);
printf("%lld\n",ans);
}
}
}
return 0;
}