#include <bits/stdc++.h>
using namespace std;
int n;
struct SegTree {
vector<int> aint;
SegTree(vector<int>& v) {
aint.resize(4 * (n + 1));
build(v);
}
int query(vector<int>& v, int a, int b, int i = 1, int j = n, int idx = 1) {
if (i == a && j == b)
return aint[idx];
int mid = i + (j - i) / 2;
if (b <= mid)
return query(v, a, b, i, mid, 2 * idx);
if (mid < a)
return query(v, a, b, mid + 1, j, 2 * idx + 1);
return query(v, a, mid, i, mid, 2 * idx)
+ query(v, mid + 1, b, mid + 1, j, 2 * idx + 1);
}
void update(vector<int>& v, int a, int x, int i = 1, int j = n, int idx = 1) {
if (i == j) {
aint[idx] = v[i] = max(0, v[i] - x);
return;
}
int mid = i + (j - i) / 2;
if (a <= mid) {
update(v, a, x, i, mid, 2 * idx);
} else {
update(v, a, x, mid + 1, j, 2 * idx + 1);
}
aint[idx] = aint[2 * idx] + aint[2 * idx + 1];
}
private:
void build(vector<int>& v, int i = 1, int j = n, int idx = 1) {
if (i == j) {
aint[idx] = v[i];
return;
}
int mid = i + (j - i) / 2;
build(v, i, mid, 2 * idx);
build(v, mid + 1, j, 2 * idx + 1);
aint[idx] = aint[2 * idx] + aint[2 * idx + 1];
}
};
signed main() {
#ifndef LOCAL
cin.tie(nullptr)->sync_with_stdio(false);
freopen("datorii.in", "r", stdin);
freopen("datorii.out", "w", stdout);
#endif
int m; cin >> n >> m;
vector<int> v(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> v[i];
}
SegTree aint(v);
while (m--) {
int q, a, b; cin >> q >> a >> b;
if (q == 1)
cout << aint.query(v, a, b) << '\n';
else
aint.update(v, a, b);
}
return 0;
}