#include <cstdio>
using namespace std;
#define maxn 100005
long AI[2*maxn];
long n,m,i,j,op,a,b,nr;
long rez,m;
void aib_push ( long ind, long val, long st, long dr, long nod )
{
AI[nod]+=val;
if ( st==dr )
return ;
else{
if ( m >= ind )
return aib_push( ind, val, st, m, 2*nod );
else
return aib_push ( ind, val , m+1, dr , 2*nod+1 );
}
}
long aib_query ( long c1, long c2, long st, long dr, long nod )
{
long m;
m=(st+dr)/2;
if ( st==c1 && dr==c2 )
return AI[nod];
if ( m >= c2 )
return aib_query ( c1,c2,st,m,2*nod );
if ( m<c1 )
return aib_query ( c1,c2,m+1,dr,2*nod+1);
return aib_query ( c1,m,st,m,2*nod) + aib_query ( m+1,c2,m+1,dr,2*nod+1 );
}
long aib_search ( long val , long st, long dr, long nod )
{
//printf (" val: %d st: %d dr: %d nod: %d AI: %d \n",val,st,dr,nod,AI[nod]);
if ( st > dr )
return -1 ;
long m=(st+dr)/2;
if ( rez + AI[nod] == val )
return dr;
if ( rez + AI[2*nod] < val )
{
rez+=AI[2*nod];
return aib_search ( val,m+1,dr,2*nod+1 );
}
else
return aib_search ( val,st,m,2*nod );
}
int main()
{
freopen ("aib.in","r",stdin);
freopen ("aib.out","w",stdout);
scanf ("%d %d",&n,&m);
for ( i=1; i<=n; i++ )
{
scanf ("%d",&a);
aib_push ( i,a,1,n,1 );
}
for ( i=1; i<=m; i++ )
{
scanf ("%d",&op );
if ( op == 0 )
{
scanf ( "%d %d",&a,&b );
aib_push ( a,b,1,n,1 );
}
if ( op == 1 )
{
scanf ( "%d %d",&a,&b );
nr=aib_query ( a,b,1,n,1 );
printf ( "%d\n", nr );
}
if ( op == 2 )
{
scanf ( "%d",&a);
rez=0;
nr=aib_search ( a,1,n,1 );
//if ( rez == a )
printf ( "%d\n", nr );
/*else
printf ( "-1\n" );*/
}
}
return 0;
}