/*
区间更新 求区间和
*/
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
#define maxn 100000+100
ll sum[maxn<<2];
ll lazy[maxn<<2];
//int a[maxn<<2];
void build(int l,int r,int rt)
{
lazy[rt]=0;
if(l==r)
{
scanf("%lld",&sum[rt]);
return;
}
int mid=(l+r)/2;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int l,int r,int rt)
{
if(lazy[rt])
{
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
int mid=(l+r)/2;
sum[rt<<1]+=(mid-l+1)*lazy[rt];
sum[rt<<1|1]+=(r-mid)*lazy[rt];
lazy[rt]=0;
}
}
void change(int l,int r,int rt,int L,int R,int c)
{
if(L<=l&&r<=R)
{
lazy[rt]+=(ll)c;
sum[rt]+=(r-l+1)*(ll)c;
return;
}
pushdown(l,r,rt);
int mid=(l+r)/2;
if(R>mid)
change(mid+1,r,rt<<1|1,L,R,c);
if(L<=mid)
change(l,mid,rt<<1,L,R,c);
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
ll query(int l,int r,int rt,int a,int b)
{
if(l>=a&&r<=b)
return sum[rt];
pushdown(l,r,rt);
int mid=(l+r)/2;
ll ans=0;
if(a<=mid)
ans+=query(l,mid,rt<<1,a,b);
if(b>mid)
ans+=query(mid+1,r,rt<<1|1,a,b);
return ans;
}
int main()
{
int t,n,K;
while(~scanf("%d%d",&n,&t))
{
build(1,n,1);
char s[3];
while(t--)
{
int a,b,c;
scanf("%s",s);
if(s[0]=='C')
{
scanf("%d%d%d",&a,&b,&c);
change(1,n,1,a,b,c);
}
else
{
scanf("%d%d",&a,&b);
printf("%lld\n",query(1,n,1,a,b));
}
}
}
return 0;
}