#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int DMAX = 15005;
int p, q, A[DMAX], V[DMAX * 3];
void creare_arbore (int nod, int l, int r) {
if(l == r) {
V[nod] = A[l];
return;
}
int m = (l + r) / 2;
creare_arbore (2 * nod, l, m);
creare_arbore (2 * nod + 1, m + 1, r);
V[nod] = V[nod * 2] + V[nod * 2 + 1];
}
void updatare_arbore (int nod, int l, int r) {
if(l == r) {
V[nod] -= q;
return;
}
int m = (l + r) / 2;
if(p <= m)
updatare_arbore (nod * 2, l, m);
else
updatare_arbore (nod * 2 + 1, m + 1, r);
V[nod] = V[nod * 2] + V[nod * 2 + 1];
}
int querry_arbore (int nod, int l, int r) {
if(l >= p && r <= q)
return V[nod];
if(p > r || q < l)
return -1;
int m = (l + r) / 2, a = querry_arbore (nod * 2, l, m), b = querry_arbore (nod * 2 + 1, m + 1, r);
if(a != -1 && b != -1)
return a + b;
else
if(a != -1 && b == -1)
return a;
else
if(a == -1 && b != -1)
return b;
else
return -1;
}
int main () {
freopen ("datorii.in", "r", stdin); freopen ("datorii.out", "w", stdout);
int N, M, i, op;
scanf ("%d%d",&N, &M);
for(i = 1; i <= N; ++i)
scanf ("%d", &A[i]);
creare_arbore (1, 1, N);
while (M--) {
scanf ("%d%d%d", &op, &p, &q);
if(op)
printf ("%d\n", querry_arbore (1, 1, N));
else
updatare_arbore (1, 1, N);
}
}