////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>#include <math.h>#include <vector>using namespace std;typedef long long LL;const int oo = 0xfffffff;const int maxn = 110007;#define lson rt<<1 //这里是rt*2的意思#define rson rt<<1|1 //这里是rt*2+1的意思int A[maxn];struct node{ int l, r; int len() //在节点处有几个元素 { return r-l+1; } LL s, e; //s为改节点处的元素的和,e为节点的增量。} tree[maxn<<2];void build(int l, int r, int rt){ tree[rt].l = l; tree[rt].r = r; tree[rt].e = 0; //增量初始化为零 if(l == r) { tree[rt].s = A[l]; return ; } int mid = (l+r)/2; build(l, mid, rt*2); build(mid+1, r, rson); tree[rt].s = tree[lson].s + tree[rson].s;}void down(int rt) //区间的覆盖以及节点的增量和总量的计算{ tree[lson].s += tree[lson].len()*tree[rt].e; //该区间左儿子的增加量 tree[rson].s += tree[rson].len()*tree[rt].e; //该区间右儿子的增加量 tree[lson].e += tree[rt].e; //把区间的增量复制给儿子以方便下面的赋值计算 tree[rson].e += tree[rt].e; tree[rt].e = 0; //区间清零!!!!}void update(int l, int r, int val, int rt){ tree[rt].s += val*(r-l+1); if(tree[rt].l == l && r == tree[rt].r) { tree[rt].e += val; return; } down(rt); int mid = (tree[rt].l+tree[rt].r)/2; if(r <= mid) update(l, r, val, lson); else if(l > mid)update(l, r, val, rson); else { update(l, mid, val, lson); update(mid+1, r, val,rson); }}LL query(int l, int r, int rt){ if(tree[rt].l == l && r == tree[rt].r) { return tree[rt].s; } down(rt); int mid = (tree[rt].l+tree[rt].r)/2; if(r <= mid) return query(l, r, lson); else if(l > mid) return query(l, r, rson); else { LL lsum, rsum; lsum = query(l, mid, lson); rsum = query(mid+1, r, rson); return lsum+rsum ; }}int main(){ int n, q, i, a, b, c; while(scanf("%d %d", &n, &q) != EOF) { char op[20]; for(i = 1; i <= n; i++) scanf("%d", &A[i]); build(1, n, 1); while(q--) { scanf("%s %d %d", op, &a, &b); if(op[0] == 'Q') { printf("%lld\n", query(a, b, 1)); continue; } scanf("%d", &c); update(a, b, c, 1); } } return 0;}