#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
struct node{
int l, r;
long long v, t;
} tr[N << 2];
int w[N];
void pushup(int n){
tr[n].v = tr[n << 1].v + tr[n << 1 | 1].v;
} //update root value
void pushdown(int n){
if(tr[n].t){
auto &root = tr[n], &l = tr[n << 1], &r = tr[n << 1 | 1];
l.t += root.t;
l.v += (l.r - l.l + 1) * root.t;
r.t += root.t;
r.v += (r.r - r.l + 1) * root.t;
root.t = 0;
}
}//update child lazytagValue
void build(int u, int l, int r)
{
if (l == r) tr[u] = {l, r, w[l], 0};
else
{
tr[u] = {l, r};
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
//build the tree
void modify(int n, int l, int r, int v){
if(l <= tr[n].l && tr[n].r <= r){
tr[n].v += (tr[n].r - tr[n].l + 1) * v;
tr[n].t += v;
}else{
pushdown(n);
int mid = tr[n].l + tr[n].r >> 1;
if(l <= mid) modify(n << 1, l, r, v);
if(r > mid) modify(n << 1 | 1, l, r, v);
pushup(n);
}
} // make lazy tag effect
long long query(int u, int l, int r)
{
if (l <= tr[u].l && tr[u].r <= r) return tr[u].v;
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
long long v = 0;
if (l <= mid) v = query(u << 1, l, r);
if (r > mid) v += query(u << 1 | 1, l, r);
return v;
}
int main(){
int n, m;
cin >> n >> m;
for(int i = 1;i <= n;i ++)
cin >> w[i];
build(1, 1, n);
for(int i = 0;i < m;i ++){
char op;
cin >> op;
if(op == 'Q'){
int a, b;
cin >> a >> b;
cout << query(1, a, b) << '\n';
}else{
int a, b, c;
cin >> a >> b >> c;
modify(1, a, b, c);
}
}
}