//poj 3468
#include <iostream>
using namespace std;
#define MAX 100100
struct node
{
int left, right;
//区间和
long long sum;
//增加量
long long add;
//求分割点
int get_mid() {
return (left + right) / 2;
}
//求区间长度
int get_dis() {
return right - left + 1;
}
};
node tree[MAX * 3];
long long d[MAX];
//建树
long long build(int left, int right, int loc)
{
int LL = loc << 1;
int RR = LL | 1;
tree[loc].left = left;
tree[loc].right = right;
//初始增量为零
tree[loc].add = 0;
if (left == right) {
return tree[loc].sum = d[left];
}
int mid = tree[loc].get_mid();
return tree[loc].sum = build(left, mid, LL) + build(mid + 1, right, RR);
}
//更新节点
void update(int left, int right, long long value, int loc)
{
int LL = loc << 1;
int RR = LL | 1;
//如果是某个节点,直接增加增量。
if (tree[loc].left == left && tree[loc].right == right)
{
tree[loc].add += value;
return ;
}
//不管要更新的区间位于什么位置上,根节点的值必定增加((right - left + 1) * value);
tree[loc].sum += (long long)(right - left + 1) * value;
//递归更新左右节点
int mid = tree[loc].get_mid();
if (right <= mid) {
update(left, right, value, LL);
} else if (mid < left) {
update(left, right, value, RR);
} else {
update(left, mid, value, LL);
update(mid + 1, right, value, RR);
}
}
//查询区间值
long long query(int left, int right, int loc)
{
int LL = loc << 1;
int RR = LL | 1;
//刚好查询的区间和是一个节点的区间和
if (tree[loc].left == left && tree[loc].right == right) {
return tree[loc].sum + (long long)tree[loc].get_dis() * tree[loc].add;
}
//区间有增量
if (tree[loc].add) {
//先更新本节点的区间和
tree[loc].sum += (long long)tree[loc].get_dis() * tree[loc].add;
//增量向左右节点传递
tree[LL].add += tree[loc].add;
tree[RR].add += tree[loc].add;
//本节点增量设置为零
tree[loc].add = 0;
}
//递归查询左右子树
int mid = tree[loc].get_mid();
if (right <= mid) {
return query(left, right, LL);
} else if (mid < left) {
return query(left, right, RR);
} else {
return query(left, mid, LL) + query(mid + 1, right, RR);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("3468.txt", "r", stdin);
#endif
int n, q;
while (cin >> n >> q)
{
int i;
for (i = 1; i <= n; i++) {
scanf("%lld", &d[i]);
}
build(1, n, 1);
char op[5];
int a, b, c;
while (q--) {
scanf("%s", &op);
if (op[0] == 'Q') {
scanf("%d %d", &a, &b);
if (a > b) {
int temp = a;
a = b;
b = temp;
}
printf("%lld\n", query(a, b, 1));
} else {
scanf("%d %d %lld", &a, &b, &c);
if (a > b) {
int temp = a;
a = b;
b = temp;
}
update(a, b, c, 1);
}
}
}
return 0;
}