#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
using namespace std;
int n,q,a,b,c,cnt=0;
struct Node
{
int l,r;
long long sum,inc;
Node*left;
Node*right;
}T[200010];
void Build(Node*root,int l,int r)
{
root->l=l;
root->r=r;
root->sum=0;
root->inc=0;
if(l==r)return;
int mid=(l+r)/2;
cnt++;
root->left=T+cnt;
cnt++;
root->right=T+cnt;
Build(root->left,l,mid);
Build(root->right,mid+1,r);
}
void Insert(Node*root,int index,int a)
{
root->sum+=a;
if(root->l==root->r)return;
int mid=(root->l+root->r)/2;
if(index<=mid)
{
Insert(root->left,index,a);
}
else
{
Insert(root->right,index,a);
}
}
void Add(Node*root,int l,int r,int c)
{
if(root->l==l&&root->r==r)
{
root->inc+=c;
return;
}
root->sum+=(r-l+1)*c;
int mid=(root->l+root->r)/2;
if(r<=mid)
{
Add(root->left,l,r,c);
}
else if(l>mid)
{
Add(root->right,l,r,c);
}
else
{
Add(root->left,l,mid,c);
Add(root->right,mid+1,r,c);
}
}
long long Query(Node*root,int l,int r)
{
if(root->l==l&&root->r==r)
{
return root->sum+root->inc*(r-l+1);
}
int mid=(root->l+root->r)/2;
root->sum+=(root->r-root->l+1)*root->inc;
Add(root->left,root->l,mid,root->inc);
Add(root->right,mid+1,root->r,root->inc);
root->inc=0;
if(r<=mid)
{
return Query(root->left,l,r);
}
else if(l>mid)
{
return Query(root->right,l,r);
}
else
{
return Query(root->left,l,mid)+Query(root->right,mid+1,r);
}
}
int main()
{
cin>>n>>q;
Build(&T[0],1,n);
for(int i=1;i<=n;++i)
{
cin>>a;
Insert(&T[0],i,a);
}
for(int i=0;i<q;++i)
{
string s;
cin>>s;
if(s[0]=='C')
{
cin>>a>>b>>c;
Add(T,a,b,c);
}
else
{
cin>>a>>b;
cout<<Query(T,a,b)<<endl;
}
}
return 0;
}