#include <cstdio>
#include <iostream>
using namespace std;
const int N = 100010;
int n,m;
typedef long long ll;
struct tree {
int l,r;
ll sum,add;
}tr[4*N];
int a[N];
void pushup(int c) {
tr[c].sum = tr[c<<1].sum+tr[c<<1|1].sum;
}
void pushdown(int c) {
if (tr[c].l == tr[c].r) return;
auto &root = tr[c], &left = tr[c<<1], &right = tr[c<<1|1];
left.add += root.add; left.sum += (ll)(left.r-left.l+1)*(root.add);
right.add += root.add; right.sum += (ll)(right.r-right.l+1)*(root.add);
root.add = 0;
}
void build(int c, int l, int r) {
if (l == r) tr[c] = {l,r,a[l],0};
else {
tr[c] = {l,r};
int mid = l+r>>1;
build(c<<1,l,mid);build(c<<1|1,mid+1,r);
pushup(c);
}
}
void modify(int c, int l, int r, int x) {
if (l <= tr[c].l && tr[c].r <= r) {
tr[c].sum += (ll)(tr[c].r - tr[c].l + 1)*x;
tr[c].add += x;
} else {
pushdown(c);
int mid = tr[c].l+tr[c].r>>1;
if (l <= mid) modify(c<<1,l,r,x);
if (r > mid) modify(c<<1|1,l,r,x);
pushup(c);
}
}
ll query(int c, int l, int r) {
if (l <= tr[c].l && tr[c].r <= r) {
return tr[c].sum;
} else {
pushdown(c);
ll ans = 0;
int mid = tr[c].l+tr[c].r>>1;
if (l <= mid) ans = query(c<<1,l,r);
if (r > mid) ans += query(c<<1|1,l,r);
pushup(c);
return ans;
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i = 1; i <= n; ++i) scanf("%d",&a[i]);
build(1,1,n);
while (m--) {
char op[4]; int l, r; scanf("%s%d%d",op,&l,&r);
if (*op == 'Q') {
printf("%lld\n",query(1,l,r));
} else {
int x; scanf("%d",&x);
modify(1,l,r,x);
}
}
return 0;
}