#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 201000;
ll n, m, a[N];
struct LineTree {
ll sum;
} seg[N * 4];
inline void update(int id) {
seg[id].sum = seg[id * 2].sum + seg[id * 2 + 1].sum;
}
inline void build(int id, int l, int r) {
if (l == r) seg[id].sum = a[l];
else {
int mid = (l + r) / 2;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
update(id);
}
}
inline void add(int id, int l, int r, int lpos, int rpos, ll k) {
if (l == r) seg[id].sum += k;
else {
int mid = (l + r) / 2;
if (rpos <= mid) add(id * 2, l, mid, lpos, rpos, k);
else if (lpos > mid) add(id * 2 + 1, mid + 1, r, lpos, rpos, k);
else {
add(id * 2, l, mid, lpos, mid, k);
add(id * 2 + 1, mid + 1, r, mid + 1, rpos, k);
}
update(id);
}
}
inline ll query(int id, int l, int r, int ql, int qr) {
if (l == ql && r == qr) return seg[id].sum;
else {
int mid = (l + r) / 2;
if (qr <= mid) return query(id * 2, l, mid, ql, qr);
else if (ql > mid) return query(id * 2 + 1, mid + 1, r, ql, qr);
else {
return query(id * 2, l, mid, ql, mid) + query(id * 2 + 1, mid + 1, r, mid + 1, qr);
}
update(id);
}
}
int main() {
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int opt, x, y;
ll k;
scanf("%d%d%d", &opt, &x, &y);
if (opt == 1) {
scanf("%lld", &k);
add(1, 1, n, x, y, k);
} else {
printf("%lld\n", query(1, 1, n, x, y));
}
}
}
(抄老师的板子)