#include <cstdio>
#define NMAX 16500
#define MMAX 100010
int N, M;
int v[NMAX], aint[NMAX];
void build (int node, int left, int right) { //node should have the answer for [left, right]
if (left == right) {
aint[node] = v[left];
return;
}
int mid = (left + right) / 2;
build (2 * node, left, mid);
build (2 * node +1, mid + 1, right);
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
void update (int node, int left, int right, int pos, int val) { //minus val from position pos
if (left == right) {
aint[node] -= val;
return;
}
int mid = (left + right) / 2;
if (pos <= mid) {
update (2 * node, left, mid, pos, val);
}
else {
update (2 * node, mid + 1, right, pos, val);
}
aint[node] = aint[2 * node] + aint[2 * node + 1];
}
int query (int node, int left, int right, int A, int B) {
if (left >= A && right <= B) {
return aint[node];
}
int mid = (left + right) / 2;
int ans = 0;
if (A <= mid) {
ans += query (2 * node, left, mid, A, B);
}
if (B > mid) {
ans += query (2 * node + 1, mid + 1, right, A, B);
}
return ans;
}
int main () {
freopen ("datorii.in", "r", stdin);
freopen ("datorii.out", "w", stdout);
scanf ("%d%d", &N, &M);
int np2 = 1;
while (np2 < N) {
np2 = np2 << 1;
}
for (int i = 1; i <= N; i++) {
scanf ("%d", &v[i]);
}
build (1, 1, np2);
int type, X, Y;
while (M--) {
scanf ("%d%d%d", &type, &X, &Y);
if (type == 0) {
update (1, 1, np2, X, Y);
}
else {
int a = query (1, 1, np2, X, Y);
printf ("%d\n", a);
}
}
return 0;
}