#include <cstdio>
using namespace std;
const int DMAX = 100002;
int A[DMAX * 3], a, b, N, s;
short V[DMAX];
void creare_arbore (int nod, int l, int r) {
if (l == r) {
A[nod] = V[l];
return;
}
int m = (l + r) / 2;
creare_arbore (nod * 2, l, m);
creare_arbore (nod * 2 + 1, m + 1, r);
A[nod] = A[nod * 2] + A[nod * 2 + 1];
}
void actualizare_arbore () {
int nod = 1, m = (1 + N) / 2, l = 1, r = N;
while (l != r) {
A[nod] += b;
if (a <= m)
nod *= 2, r = m;
else
nod = nod * 2 + 1, l = m + 1;
m = (l + r) / 2;
}
}
void querry_0 (int nod, int l, int r) {
if (a <= l && b >= r) {
s += A[nod]; return;
}
if (r < a || b < l)
return;
int m = (l + r) / 2;
querry_0 (nod * 2, l, m);
querry_0 (nod * 2 + 1, m + 1, r);
}
int querry_1 () {
int nod = 1, m = (1 + N) / 2, l = 1, r = N;
while (l != r) {
if (s + A[nod * 2] > a)
nod *= 2, r = m;
else
s += A[nod * 2], nod = nod * 2 + 1, l = m + 1;
m = (l + r) / 2;
}
return l;
}
int main() {
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int M, i, k;
scanf ("%d%d", &N, &M);
for (i = 1; i <= N; ++i)
scanf ("%d", &V[i]);
creare_arbore (1, 1, N);
while (M--) {
scanf ("%d", &k);
switch (k) {
case 0: scanf ("%d%d", &a, &b);
actualizare_arbore ();
break;
case 1: scanf ("%d%d", &a, &b);
s = 0; querry_0 (1, 1, N);
printf ("%d\n", s);
break;
default: scanf ("%d", &a);
if (a == A[1]){
printf ("%d\n", N); break;
}
s = 0;
b = querry_1 ();
if (s == a)
printf ("%d\n", b - 1);
else
printf ("-1\n");
}
}
}