#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n, m, a[15001], tree[60001];
void update(int left, int right, int currentNode, int pos) {
if (left == right) {
tree[currentNode] = a[pos];
return;
} else if (left <= pos && pos <= (left + right) / 2) {
update(left, (left + right) / 2, currentNode * 2, pos);
} else {
update((left + right) / 2 + 1, right, currentNode * 2 + 1, pos);
}
tree[currentNode] = tree[currentNode * 2] + tree[currentNode * 2 + 1];
}
void build(int left, int right, int currentNode) {
if (left == right) {
tree[currentNode] = a[left];
update(1, n, 1, left);
return;
}
build(left, (left + right) / 2, currentNode * 2);
build((left + right) / 2 + 1, right, currentNode * 2 + 1);
}
int query(int left, int right, int currentNode, int startPos, int endPos) {
if (startPos <= left && right <= endPos) {
return tree[currentNode];
} else if (endPos < left || right < startPos) {
return 0;
}
return query(left, (left + right) / 2, currentNode * 2, startPos, endPos) + query((left + right) / 2 + 1, right, currentNode * 2 + 1, startPos, endPos);
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
fin >> a[i];
}
build(1, n, 1);
for (int i = 1; i <= m; ++i) {
int op;
fin >> op;
if (op == 0) {
int t, v;
fin >> t >> v;
a[t] -= v;
update(1, n, 1, t);
} else {
int p, q;
fin >> p >> q;
fout << query(1, n, 1, p, q) << '\n';
}
}
return 0;
}