#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <unordered_map>
#include <set>
#include <utility>
#include <vector>
using namespace std;
#ifdef LOCAL
#define fin cin
#define fout cout
#else
ifstream fin("datorii.in");
ofstream fout("datorii.out");
#endif
int a[15001], aint[60004];
void build(int node, int l, int r) {
if (l == r) {
aint[node] = a[l];
return;
}
int mid = (l + r) / 2;
build(node * 2, l, mid);
build(node * 2 + 1, mid + 1, r);
aint[node] = aint[node * 2] + aint[node * 2 + 1];
}
void update(int node, int l, int r, int pos) {
if (l == r) {
aint[node] = a[pos];
return;
}
int mid = (l + r) / 2;
if (pos <= mid) update(node * 2, l, mid, pos);
else update(node * 2 + 1, mid + 1, r, pos);
aint[node] = aint[node * 2] + aint[node * 2 + 1];
}
int query(int node, int l, int r, int ql, int qr) {
if (qr < l || r < ql) return 0;
if (ql <= l && r <= qr) return aint[node];
int mid = (l + r) / 2;
return query(node * 2, l, mid, ql, qr) + query(node * 2 + 1, mid + 1, r, ql, qr);
}
int main() {
int n, m, t, x, y;
fin >> n >> m;
for (int i=1; i<=n; i++) fin >> a[i];
build(1, 1, n);
for (int i=1; i<=m; i++) {
fin >> t >> x >> y;
if (t == 0) {
a[x] -= y;
update(1, 1, n, x);
}
else fout << query(1, 1, n, x, y) << '\n';
}
}