爆0了QAQ
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long l;
l n, m, a[100005], sum[100005], tag[100005], op, x, y, k;
l lc(l x) {return x << 1;}
l rc(l x) {return x << 1 | 1;}
void move (l x, l t, l lef, l rig) {
sum[x] += t * (rig - lef + 1);
tag[x] += t;
}
void up(l x) {
sum[x] = sum[lc(x)] + sum[rc(x)];
}
void down(l x, l lef, l rig) {
l mid = (lef + rig) >> 1;
move(lc(x), lef, mid, tag[x]);
move(rc(x), mid + 1, rig, tag[x]);
tag[x] = 0;
}
void build(l x, l lef, l rig) {
if (lef == rig) {
sum[x] = a[lef];
return;
}
l mid = (lef + rig) >> 1;
build(lc(x), lef, mid);
build(rc(x), mid + 1, rig);
up(x);
printf("sum[%lld][%lld] = %lld\n", lef, rig, sum[x]);
}
l sums(l x, l ql, l qr, l lef, l rig) {
if (ql <= lef && rig <= qr) return sum[x];
down(x, lef, rig);
l ans = 0;
l mid = (lef + rig) >> 1;
if (ql <= mid) {
ans += sums(lc(x), ql, qr, lef, mid);
}
if (mid < qr) {
ans += sums(rc(x), ql, qr, mid + 1, rig);
}
return ans;
}
void update(l x, l ql, l qr, l lef, l rig, l t) {
if (ql <= lef && rig <= qr) {
move(x, lef, rig, t);
return;
}
down(x, lef, rig);
l mid = (lef + rig) >> 1;
if (ql <= mid) {
update(lc(x), ql, qr, lef, mid, tag[x]);
}
if (mid < qr) {
update(rc(x), ql, qr, mid + 1, rig, tag[x]);
}
up(x);
}
int main() {
scanf("%lld%lld", &n, &m);
for (l i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
build(1, 1, n);
for (l i = 1; i <= n; ++i) {
scanf("%lld", &op);
if (op == 1) {
scanf("%lld%lld%lld", &x, &y, &k);
update(1, x, y, 1, n, k);
} else {
scanf("%lld%lld", &x, &y);
printf("%lld\n", sums(1, x, y, 1, n));
}
}
return 0;
}