#include <iostream>
#include <fstream>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int NMAX = 15001;
int v[NMAX], tree[4 * NMAX];
void buildTree(int node, int st, int dr) {
if (st == dr) {
tree[node] = v[st];
}
else {
int mid = (st + dr) / 2;
buildTree(node * 2, st, mid);
buildTree(node * 2 + 1, mid + 1, dr);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
}
int querySum(int node, int st, int dr, int qst, int qdr) {
if (qst <= st && dr <= qdr) return tree[node];
int mid = (st + dr) / 2;
if (qdr <= mid) return querySum(node * 2, st, mid, qst, qdr);
else if (qst > mid) return querySum(node * 2 + 1, mid + 1, dr, qst, qdr);
else {
return querySum(node * 2, st, mid, qst, qdr) + querySum(node * 2 + 1, mid + 1, dr, qst, qdr);
}
}
void updateTree(int node, int st, int dr, int pos, int val) {
if (st == dr) tree[node] -= val;
else {
int mid = (st + dr) / 2;
if (pos <= mid) updateTree(node * 2, st, mid, pos, val);
else updateTree(node * 2 + 1, mid + 1, dr, pos, val);
tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
}
int main() {
int n, m;
in >> n >> m;
for (int i = 0; i < n; i++) in >> v[i];
buildTree(1, 0, n - 1);
for (int i = 0; i < m; i++) {
int t, a, b;
in >> t >> a >> b;
if (t == 0) {
updateTree(1, 0, n - 1, a - 1, b);
}
else {
out << querySum(1, 0, n - 1, a - 1, b - 1) << '\n';
}
}
return 0;
}