#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, m, a[N], tree[N * 4], lzy[N * 4];
void push_up(int rt) {
tree[rt] = tree[rt * 2] + tree[rt * 2 + 1];
}
void push_down(int rt) {
if (lzy[rt]) {
lzy[rt * 2] += lzy[rt];
lzy[rt * 2 + 1] += lzy[rt];
a[rt * 2] += lzy[rt];
a[rt * 2 + 1] += lzy[rt];
lzy[rt] = 0;
}
}
void build(int rt, int l, int r) {
if (l == r) tree[rt] = a[l];
else {
int m = (l + r) / 2;
build(rt * 2, l, m);
build(rt * 2 + 1, m + 1, r);
push_up(rt);
}
}
void update(int L, int R, int v, int l, int r, int k) {
if (L <= l && r <= R) {
tree[k] += v;
a[k] += v;
} else {
push_down(k);
int m = (l + r) / 2;
if (L <= m) update(L, R, v, l, m, k * 2);
if (R > m) update(L, R, v, m + 1, r, k * 2 + 1);
push_up(k);
}
}
int query(int L, int R, int l, int r, int k) {
if (L <= l && r <= R) return tree[k];
else {
push_down(k);
int m = (l + r) / 2, ans = 0;
if (L <= m) ans += query(L, R, l, m, k * 2);
if (R > m) ans += query(L, R, m + 1, r, k * 2 + 1);
return ans;
}
}
signed main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
while (m--) {
int op; cin >> op;
if (op == 1) {
int x, y, z;
cin >> x >> y >> z;
update(x, y, z, 1, n, 1);
} else {
int x, y;
cin >> x >> y;
cout << query(x, y, 1, n, 1) << endl;
}
}
}
求教模板题