#include <cstdio>
const int DMAX = 200006;
short A[DMAX], V[DMAX / 2];
int x, y, S;
void creare_arbore (int l, int r, int nod) {
if (l == r) {
A[nod] = V[l];
return;
}
int m = (l + r) / 2;
creare_arbore (l, m, nod * 2);
creare_arbore (m + 1, r, nod * 2 + 1);
A[nod] = A[nod * 2] + A[nod * 2 + 1];
}
void actualizare_arbore (int l, int r, int nod) {
int m;
while (l != r) {
A[nod] += y;
m = (l + r) / 2;
if (x <= m)
r = m, nod *= 2;
else
l = m + 1, nod = nod * 2 + 1;
}
}
void querry_01 (int l, int r, int nod) {
if (x <= l && y >= r) {
S += A[nod];
return;
}
if (l > y || r < x)
return;
int m = (l + r) / 2;
querry_01 (l, m, nod * 2);
querry_01 (m + 1, r, nod * 2 + 1);
}
int querry_02 (int l, int r, int nod) {
while (l != r) {
if (S == x)
return r;
if (A[nod * 2] + S > x)
r = (l + r) / 2, nod *= 2;
else
S += A[nod * 2], l = (l + r) / 2 + 1, nod = nod * 2 + 1;
}
if (S == x)
return r;
return 0;
}
int main () {
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int N, Q, i;
scanf ("%d%d", &N, &Q);
for (i = 1; i <= N; ++i)
scanf ("%d", &V[i]);
creare_arbore (1, N, 1);
while (Q--) {
scanf ("%d", &i);
switch (i) {
case 0:
scanf ("%d%d", &x, &y);
actualizare_arbore (1, N, 1);
break;
case 1:
scanf ("%d%d", &x, &y);
S = 0;
querry_01 (1, N, 1);
printf ("%d\n", S);
break;
default:
scanf ("%d", &x);
S = 0;
printf ("%d\n", querry_02 (1, N, 1) - 1);
}
}
}