#include <iostream>
typedef long long ll;
using namespace std;
const int maxn = 200010;
int n, m, tot, now, tim, root[maxn], p[maxn];
ll a[maxn];
struct E {
int l, r;
ll val, buff;
} t[maxn * 100];
void build (int &x, int l, int r) {
x = ++tot;
if (l == r) { t[x].val = a[l]; return; }
int mid = l + r >> 1;
build (t[x].l, l, mid);
build (t[x].r, mid + 1, r);
t[x].val = t[t[x].l].val + t[t[x].r].val;
}
void modify (int _x, int &x, int l, int r, int L, int R, ll v) {
t[x = ++tot] = t[_x];
t[x].val += v * (min (r, R) - max (l, L) + 1);
if (L <= l && r <= R) {
t[x].buff += v;
return ;
}
int mid = l + r >> 1;
if (L <= mid) modify (t[_x].l, t[x].l, l, mid, L, R, v);
if (R > mid) modify (t[_x].r, t[x].r, mid + 1, r, L, R, v);
}
ll query (int x, int l, int r, int L, int R) {
if (L <= l && r <= R) return t[x].val;
ll tmp = 0;
int mid = l + r >> 1;
if (L <= mid) tmp += query (t[x].l, l, mid, L, R);
if (mid < R) tmp += query (t[x].r, mid + 1, r, L, R);
tmp += t[x].buff * (min (r, R) - max (l, L) + 1);
return tmp;
}
int main () {
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build (root[0], 1, n);
for (int i = 1; i <= m; i++) {
char op;
int l, r, ti;
ll x;
cin >> op;
if (op == 'C') {
cin >> l >> r >> x;
p[++now] = ++tim;
modify (root[tim - 1], root[tim], 1, n, l, r, x);
now++;
} else if (op == 'Q') {
cin >> l >> r;
cout << query (root[tim], 1, n, l, r) << '\n';
} else if (op == 'H') {
cin >> l >> r >> ti;
cout << query (root[p[ti]], 1, n, l, r) << '\n';
} else {
cin >> ti;
now = ti;
root[++tim] = root[p[ti]];
}
}
return 0;
}