#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define DIM 200010
int Arb[ DIM ],i,j,n,m,val,pos,q,ans,suma,in,sf;
void FuncUpdate(int nod, int left, int right)
{
if( left == right )
{
Arb[ nod ] += val;
return;
}
int middle = ( left + right ) / 2;
if( pos <= middle )
FuncUpdate( 2 * nod , left , middle );
else
FuncUpdate( 2 * nod + 1 , middle + 1 , right );
Arb[ nod ] = Arb[ 2 * nod ] + Arb[ 2 * nod + 1 ];
}
void FuncSolve1(int nod, int left, int right)
{
if( left >= in && right <= sf )
{
ans += Arb[ nod ];
return;
}
if( left > sf || right < in )
return;
int middle = ( left + right ) / 2;
FuncSolve1( 2 * nod , left , middle );
FuncSolve1( 2 * nod + 1 , middle + 1 , right );
}
void FuncSolve2(int nod, int left, int right, int sum)
{
if( sum == 0 )
{
ans = left - 1;
return;
}
if( sum < 0 )
{
ans = -1;
return;
}
if( left == right )
{
if( Arb[ nod ] == sum )
ans = left;
else
ans = -1;
return;
}
int middle = ( left + right ) / 2;
if( Arb[ 2 * nod ] <= sum )
{
sum -= Arb[ 2 * nod ];
FuncSolve2( 2 * nod + 1 , middle + 1 , right , sum );
}
else
{
FuncSolve2( 2 * nod , left , middle , sum );
}
}
int main()
{
fin>>n>>m;
for( i = 1 ; i <= n ; ++i )
{
fin>>val;
pos = i;
FuncUpdate( 1 , 1 , n );
}
for( i = 1 ; i <= m ; ++i )
{
fin>>q;
if( q == 0 )
{
fin>>pos>>val;
FuncUpdate( 1 , 1 , n );
}
else if( q == 1 )
{
fin>>in>>sf;
ans = 0;
FuncSolve1( 1 , 1 , n );
fout<<ans<<'\n';
}
else if( q == 2 )
{
fin>>suma;
FuncSolve2( 1 , 1 , n , suma );
fout<<ans<<'\n';
}
}
return 0;
}