#include <stdio.h>
#define mx 65010
long n,m,rez,s,maxnod=0,a,b,caz;
unsigned short ai[4*mx+4];
void add(long nod, long p, long u, long poz)
{
if (p==u && p==poz)
{
ai[nod]+=b;
return;
}
if (p<u)
{
long m=(p+u)/2;
if (poz<=m)
add(nod*2,p,m,poz);
if (m<poz)
add(nod*2+1,m+1,u,poz);
ai[nod]=ai[2*nod]+ai[2*nod+1];
}
}
void querysint(long nod, long p, long u)
{
if (a<=p && b>=u)
{
rez+=ai[nod];
return;
}
if (p<u)
{
long m=(p+u)/2;
if (a<=m)
querysint(nod*2,p,m);
if (b>m)
querysint(nod*2+1,m+1,u);
}
}
void querysm(long nod, long p, long u)
{
if (p==u && s==ai[nod])
{
rez=p;
s=0;
return;
}
if (ai[nod]<s || p==u)
{
s-=ai[nod];
return;
}
if (p<u)
{
long m=(p+u)/2;
querysm(2*nod,p,m);
if (rez==0 && s>0)
querysm(2*nod+1,m+1,u);
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%ld %ld",&n,&m);
for (int i=1; i<=n; i++)
{
scanf("%ld",&b);
add(1,1,n,i);
}
for (int i=1; i<=m; i++)
{
scanf("%ld",&caz);
if (caz<2)
scanf("%ld %ld",&a,&b);
else scanf("%ld",&s);
if (caz)
rez=0;
if (caz==2)
{
querysm(1,1,n);
if (rez)
printf("%ld\n",rez);
else printf("-1\n");
}
else if (caz==1)
{
querysint(1,1,n);
printf("%ld\n",rez);
}
else add(1,1,n,a);
}
fclose(stdin);
fclose(stdout);
return 0;
}