#include <bits/stdc++.h>
using namespace std;
const int MAXN = 15005;
const int MAXM = 100005;
int A[MAXN];
int tree[4 * MAXN];
void build(int nod, int st, int dr) {
if (st == dr) {
tree[nod] = A[st];
} else {
int mid = (st + dr) / 2;
build(2 * nod, st, mid);
build(2 * nod + 1, mid + 1, dr);
tree[nod] = tree[2 * nod] + tree[2 * nod + 1];
}
}
void update(int nod, int st, int dr, int T, int V) {
if (st == dr) {
A[st] = max(0, A[st] - V);
tree[nod] = A[st];
} else {
int mid = (st + dr) / 2;
if (T <= mid) {
update(2 * nod, st, mid, T, V);
} else {
update(2 * nod + 1, mid + 1, dr, T, V);
}
tree[nod] = tree[2 * nod] + tree[2 * nod + 1];
}
}
int query(int nod, int st, int dr, int P, int Q) {
if (P <= st && dr <= Q) {
return tree[nod];
}
int mid = (st + dr) / 2;
int sum = 0;
if (P <= mid) {
sum += query(2 * nod, st, mid, P, Q);
}
if (Q > mid) {
sum += query(2 * nod + 1, mid + 1, dr, P, Q);
}
return sum;
}
int main() {
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int N, M;
fin >> N >> M;
for (int i = 1; i <= N; i++) {
fin >> A[i];
}
build(1, 1, N);
for (int i = 0; i < M; i++) {
int tip, x, y;
fin >> tip >> x >> y;
if (tip == 0) {
update(1, 1, N, x, y);
} else {
int result = query(1, 1, N, x, y);
fout << result << "\n";
}
}
fin.close();
fout.close();
return 0;
}