#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f = fopen ( "aib.in" , "r" ) , *g = fopen ( "aib.out" , "w" );
const int MAX = 100005;
int N , nrQueries , Tree [ MAX ] , value , exp , S , sum , totalSum , left , right , i , mid , queryType , index , pos;
void update ( int index , int value )
{
exp = 0;
while ( index <= N )
{
Tree [ index ] += value;
while ( !( index & ( 1 << exp ) ) )
exp ++;
index += ( 1 << exp );
exp ++;
}
}
int detSum ( int index )
{
exp = 0; totalSum = 0;
while ( index > 0 )
{
totalSum += Tree [ index ];
while ( !( index & ( 1 << exp ) ) )
exp ++;
index -= ( 1 << exp );
exp ++;
}
return totalSum;
}
int detIndex ( int sum )
{
left = 0; right = N + 1; pos = N + 1; mid = N;
S = detSum ( N );
if ( S == sum ) pos = N;
while ( mid )
{
mid = ( left + right ) >> 1;
S = detSum ( mid );
if ( S > sum )
{
right = min ( right , mid );
mid --;
}
else
if ( S == sum )
{
pos = min ( pos , mid );
right = mid;
mid --;
}
else
{
left = max ( left , mid );
mid ++;
}
if ( mid <= left || right <= mid ) break;
}
if ( pos > N ) return -1;
return pos;
}
void read()
{
fscanf ( f , "%d %d" , &N , &nrQueries );
for ( i = 1 ; i <= N ; i ++ )
{
fscanf ( f , "%d" , &value );
update ( i , value );
}
for ( i = 1 ; i <= nrQueries ; i++ )
{
fscanf ( f , "%d " , &queryType );
if ( queryType == 0 ) //update the value
{
fscanf ( f , "%d %d" , &index , &value );
update ( index , value );
}
else
if ( queryType == 1 ) //determine sum of values
{
fscanf ( f , "%d %d" , &left , &right );
sum = detSum ( right ) - detSum ( left - 1 );
fprintf ( g , "%d\n" , sum ) ;
}
else //determine index
{
fscanf ( f , "%d" , &sum );
fprintf ( g , "%d\n" , detIndex ( sum ) );
}
}
}
int main()
{
read();
return 0;
}