// ﷽
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct Node {
Node *left{}, *right{};
int sum{};
int lazy{};
Node() {}
Node(int val) : sum(val), lazy(0) {}
Node(Node* other) {
if (other) {
left = other->left;
right = other->right;
sum = other->sum;
lazy = other->lazy;
}
}
Node(Node *l, Node *r) {
left = l;
right = r;
sum = 0;
lazy = 0;
if (left) sum += left->sum;
if (right) sum += right->sum;
}
};
struct PST {
int n;
vector<Node*> roots;
PST(int n, int m) : n(n), roots(m) { }
Node* build(int l, int r, vector<int>& a) {
if (l == r) return new Node(a[l]);
int mid = (l + r) / 2;
Node* left = build(l, mid, a);
Node* right = build(mid + 1, r, a);
return new Node(left, right);
}
Node merge(Node l, Node r) {
Node ret;
ret.sum = l.sum + r.sum;
return ret;
}
Node* update(Node* node, int l, int r, int ql, int qr, int val) {
Node* curr = new Node(node);
int overlap = max(0LL, min(r, qr) - max(l, ql) + 1);
curr->sum += val * overlap;
if (ql <= l && r <= qr) {
curr->lazy += val;
return curr;
}
int mid = (l + r) / 2;
if (ql <= mid) curr->left = update(curr->left, l, mid, ql, qr, val);
if (qr > mid) curr->right = update(curr->right, mid + 1, r, ql, qr, val);
return curr;
}
Node* update(int v, int ql, int qr, int val) { return update(roots[v], 0, n - 1, ql, qr, val); }
Node query(Node* node, int l, int r, int ql, int qr, int add) {
if (!node || l > qr || r < ql) return {};
if (l >= ql && r <= qr) { return node->sum + add * (r - l + 1); }
int mid = (l + r) / 2;
int next_add = add + node->lazy;
return merge(query(node->left, l, mid, ql, qr, next_add),
query(node->right, mid + 1, r, ql, qr, next_add));
}
int query(int v, int l, int r) {
return query(roots[v], 0, n - 1, l, r, 0).sum;
}
};
void solve(int testcase) {
int n, q; cin >> n >> q;
vector<int> arr(n);
for (auto& i : arr) cin >> i;
PST pst(n, q + 1);
pst.roots[0] = pst.build(0, n - 1, arr);
int t = 0;
while (q--) {
char op; cin >> op;
if (op == 'C') {
int l, r, d; cin >> l >> r >> d; --l, --r;
// the bug is here
pst.roots[++t] = pst.update(t, l, r, d);
} else if (op == 'Q') {
int l, r; cin >> l >> r; --l, --r;
cout << pst.query(t, l, r) << '\n';
} else if (op == 'H') {
int to, l, r; cin >> l >> r >> to; --l, --r;
cout << pst.query(to, l, r) << '\n';
} else {
int to; cin >> to;
t = to;
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int T = 1;
// cin >> T;
for (int _ = 1; _ <= T; ++_)
solve(_);
return 0;
}
Ly8gICAgICDvt70KI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgaW50IGxvbmcgbG9uZwoKc3RydWN0IE5vZGUgewogICAgTm9kZSAqbGVmdHt9LCAqcmlnaHR7fTsKICAgIGludCBzdW17fTsKICAgIGludCBsYXp5e307IAoKICAgIE5vZGUoKSB7fQogICAgTm9kZShpbnQgdmFsKSA6IHN1bSh2YWwpLCBsYXp5KDApIHt9CiAgICAKICAgIE5vZGUoTm9kZSogb3RoZXIpIHsKICAgICAgICBpZiAob3RoZXIpIHsKICAgICAgICAgICAgbGVmdCA9IG90aGVyLT5sZWZ0OwogICAgICAgICAgICByaWdodCA9IG90aGVyLT5yaWdodDsKICAgICAgICAgICAgc3VtID0gb3RoZXItPnN1bTsKICAgICAgICAgICAgbGF6eSA9IG90aGVyLT5sYXp5OwogICAgICAgIH0KICAgIH0KICAgIAogICAgTm9kZShOb2RlICpsLCBOb2RlICpyKSB7CiAgICAgICAgbGVmdCA9IGw7CiAgICAgICAgcmlnaHQgPSByOwogICAgICAgIHN1bSA9IDA7CiAgICAgICAgbGF6eSA9IDA7CiAgICAgICAgaWYgKGxlZnQpIHN1bSArPSBsZWZ0LT5zdW07CiAgICAgICAgaWYgKHJpZ2h0KSBzdW0gKz0gcmlnaHQtPnN1bTsKICAgIH0gCn07CgpzdHJ1Y3QgUFNUIHsKICAgIGludCBuOwogICAgdmVjdG9yPE5vZGUqPiByb290czsKCiAgICBQU1QoaW50IG4sIGludCBtKSA6IG4obiksIHJvb3RzKG0pIHsgfQoKICAgIE5vZGUqIGJ1aWxkKGludCBsLCBpbnQgciwgdmVjdG9yPGludD4mIGEpIHsKICAgICAgICBpZiAobCA9PSByKSByZXR1cm4gbmV3IE5vZGUoYVtsXSk7CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgICAgIE5vZGUqIGxlZnQgPSBidWlsZChsLCBtaWQsIGEpOwogICAgICAgIE5vZGUqIHJpZ2h0ID0gYnVpbGQobWlkICsgMSwgciwgYSk7CiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKGxlZnQsIHJpZ2h0KTsKICAgIH0gCgogICAgTm9kZSBtZXJnZShOb2RlIGwsIE5vZGUgcikgewogICAgICAgIE5vZGUgcmV0OwogICAgICAgIHJldC5zdW0gPSBsLnN1bSArIHIuc3VtOwogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgTm9kZSogdXBkYXRlKE5vZGUqIG5vZGUsIGludCBsLCBpbnQgciwgaW50IHFsLCBpbnQgcXIsIGludCB2YWwpIHsKICAgICAgICBOb2RlKiBjdXJyID0gbmV3IE5vZGUobm9kZSk7CiAgICAgICAgCiAgICAgICAgaW50IG92ZXJsYXAgPSBtYXgoMExMLCBtaW4ociwgcXIpIC0gbWF4KGwsIHFsKSArIDEpOwogICAgICAgIGN1cnItPnN1bSArPSB2YWwgKiBvdmVybGFwOwoKICAgICAgICBpZiAocWwgPD0gbCAmJiByIDw9IHFyKSB7CiAgICAgICAgICAgIGN1cnItPmxhenkgKz0gdmFsOwogICAgICAgICAgICByZXR1cm4gY3VycjsKICAgICAgICB9CgogICAgICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgICAgICBpZiAocWwgPD0gbWlkKSBjdXJyLT5sZWZ0ID0gdXBkYXRlKGN1cnItPmxlZnQsIGwsIG1pZCwgcWwsIHFyLCB2YWwpOwogICAgICAgIGlmIChxciA+IG1pZCkgIGN1cnItPnJpZ2h0ID0gdXBkYXRlKGN1cnItPnJpZ2h0LCBtaWQgKyAxLCByLCBxbCwgcXIsIHZhbCk7CgogICAgICAgIHJldHVybiBjdXJyOwogICAgfQoKICAgIE5vZGUqIHVwZGF0ZShpbnQgdiwgaW50IHFsLCBpbnQgcXIsIGludCB2YWwpIHsgcmV0dXJuIHVwZGF0ZShyb290c1t2XSwgMCwgbiAtIDEsIHFsLCBxciwgdmFsKTsgfQoKICAgIE5vZGUgcXVlcnkoTm9kZSogbm9kZSwgaW50IGwsIGludCByLCBpbnQgcWwsIGludCBxciwgaW50IGFkZCkgewogICAgICAgIGlmICghbm9kZSB8fCBsID4gcXIgfHwgciA8IHFsKSByZXR1cm4ge307CiAgICAgICAgCiAgICAgICAgaWYgKGwgPj0gcWwgJiYgciA8PSBxcikgeyByZXR1cm4gbm9kZS0+c3VtICsgYWRkICogKHIgLSBsICsgMSk7IH0KICAgICAgICAKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICAgICAgaW50IG5leHRfYWRkID0gYWRkICsgbm9kZS0+bGF6eTsgCiAgICAgICAgCiAgICAgICAgcmV0dXJuIG1lcmdlKHF1ZXJ5KG5vZGUtPmxlZnQsIGwsIG1pZCwgcWwsIHFyLCBuZXh0X2FkZCksIAogICAgICAgICAgICAgICBxdWVyeShub2RlLT5yaWdodCwgbWlkICsgMSwgciwgcWwsIHFyLCBuZXh0X2FkZCkpOwogICAgfSAKCiAgICBpbnQgcXVlcnkoaW50IHYsIGludCBsLCBpbnQgcikgeyAKICAgICAgICByZXR1cm4gcXVlcnkocm9vdHNbdl0sIDAsIG4gLSAxLCBsLCByLCAwKS5zdW07IAogICAgfQp9OwoKdm9pZCBzb2x2ZShpbnQgdGVzdGNhc2UpIHsKICAgIGludCBuLCBxOyBjaW4gPj4gbiA+PiBxOwogICAgdmVjdG9yPGludD4gYXJyKG4pOwogICAgZm9yIChhdXRvJiBpIDogYXJyKSBjaW4gPj4gaTsKICAgIFBTVCBwc3QobiwgcSArIDEpOwogICAgcHN0LnJvb3RzWzBdID0gcHN0LmJ1aWxkKDAsIG4gLSAxLCBhcnIpOwogICAgaW50IHQgPSAwOwogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGNoYXIgb3A7IGNpbiA+PiBvcDsKICAgICAgICBpZiAob3AgPT0gJ0MnKSB7CiAgICAgICAgICAgIGludCBsLCByLCBkOyBjaW4gPj4gbCA+PiByID4+IGQ7IC0tbCwgLS1yOwogICAgICAgICAgICAvLyB0aGUgYnVnIGlzIGhlcmUgCiAgICAgICAgICAgIHBzdC5yb290c1srK3RdID0gcHN0LnVwZGF0ZSh0LCBsLCByLCBkKTsKICAgICAgICB9IGVsc2UgaWYgKG9wID09ICdRJykgewogICAgICAgICAgICBpbnQgbCwgcjsgY2luID4+IGwgPj4gcjsgLS1sLCAtLXI7CiAgICAgICAgICAgIGNvdXQgPDwgcHN0LnF1ZXJ5KHQsIGwsIHIpIDw8ICdcbic7CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PSAnSCcpIHsKICAgICAgICAgICAgaW50IHRvLCBsLCByOyBjaW4gPj4gbCA+PiByID4+IHRvOyAtLWwsIC0tcjsKICAgICAgICAgICAgY291dCA8PCBwc3QucXVlcnkodG8sIGwsIHIpIDw8ICdcbic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHRvOyBjaW4gPj4gdG87CiAgICAgICAgICAgIHQgPSB0bzsKICAgICAgICB9CiAgICB9Cn0KCnNpZ25lZCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICAvL2ZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogICAgLy9mcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwoKICAgIGludCBUID0gMTsKICAgIC8vIGNpbiA+PiBUOwogICAgZm9yIChpbnQgXyA9IDE7IF8gPD0gVDsgKytfKSAKICAgICAgICBzb2x2ZShfKTsKCiAgICByZXR1cm4gMDsKfQo=