#include <cstdio>
#define NMAX 100005
using namespace std;
FILE *f=fopen ("datorii.in", "r");
FILE *g=fopen ("datorii.out", "w");
int n, m, summ, t, arb[NMAX], a, b, mn, x;
void citire();
void update(int a, int b);
void updateminus(int a, int b);
void suma(int a, int b);
int cautareBin(int dr, int st);
int main()
{
citire();
return 0;
}
void citire()
{
int i, q;
fscanf(f, "%d %d", &n, &m);
for (i=1;i<=n;i++)
{
fscanf(f, "%d", &x);
update(i, x);
}
for (i=0;i<m;i++)
{
fscanf(f, "%d", &q);
if (q==0)
{
fscanf(f, "%d %d", &a, &b);
updateminus(a, b);
}
if (q==1)
{
fscanf(f, "%d %d", &a, &b);
summ=0;
suma(a, b);
fprintf(g, "%d\n", summ);
}
if (q==2)
{
fscanf(f, "%d", &b);
fprintf(g, "%d\n", cautareBin(1, n));
}
}
}
int cautareBin(int st, int dr)
{
int mij;
if (st<=dr)
{
mij=(st+dr)/2;
summ=0;
suma(1, mij);
if (summ==b) return mij;
if (summ>b)
return cautareBin(st, mij-1);
if (summ<b)
return cautareBin(mij+1, dr);
}else
return -1;
}
void updateminus(int a, int b)
{
int i;
int t=a^(-a);
for (i=a;i<=n;)
{
arb[i]-=b;
t=i&(-i);
i+=t;
}
}
void update(int a, int b)
{
int i;
int t=a^(-a);
for (i=a;i<=n;)
{
arb[i]+=b;
t=i&(-i);
i+=t;
}
}
void suma(int a, int b)
{
int t, i;
for (i=b; i>0;)
{
summ+=arb[i];
t=i&(-i);
i-=t;
}
for (i=a-1; i>0;)
{
summ-=arb[i];
t=i&(-i);
i-=t;
}
}