#include <bits/stdc++.h>
using namespace std;
const int MAXN = 15005;
int n, m;
int aint[4 * MAXN];
void build(int node, int st, int dr, int val[]) {
if (st == dr) {
aint[node] = val[st];
return;
}
int mid = (st + dr) / 2;
build(2 * node, st, mid, val);
build(2 * node + 1, mid + 1, dr, val);
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
void update(int node, int st, int dr, int pos, int val) {
if (st == dr) {
aint[node] -= val;
return;
}
int mid = (st + dr) / 2;
if (pos <= mid) {
update(2 * node, st, mid, pos, val);
} else {
update(2 * node + 1, mid + 1, dr, pos, val);
}
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
int query(int node, int st, int dr, int l, int r) {
if (l <= st && dr <= r) {
return aint[node];
}
int mid = (st + dr) / 2;
int sum = 0;
if (l <= mid) {
sum += query(2 * node, st, mid, l, r);
}
if (r > mid) {
sum += query(2 * node + 1, mid + 1, dr, l, r);
}
return sum;
}
int main() {
ifstream fin("datorii.in");
ofstream fout("datorii.out");
fin >> n >> m;
int a[MAXN];
for (int i = 1; i <= n; i++) {
fin >> a[i];
}
build(1, 1, n, a);
for (int i = 0; i < m; i++) {
int op, x, y;
fin >> op >> x >> y;
if (op == 0) {
update(1, 1, n, x, y);
} else {
fout << query(1, 1, n, x, y) << "\n";
}
}
fin.close();
fout.close();
return 0;
}