#include<cstdio>
int maxx ;
const int N = 100001;
int arb [ N*4 ] ;
int inline max ( int x , int y )
{
if ( x > y )
return x;
return y ;
}
void mod ( int nod , int p , int u , int x , int y )
{
int m ;
if ( p == u )
{
arb[nod]=y;
return ;
}
m = ( p + u ) / 2 ;
if ( x <= m )
mod ( 2*nod , p , m , x , y ) ;
else
mod ( 2*nod+1 , m+1 , u , x , y ) ;
arb[nod]= max ( arb[2*nod ] , arb[2*nod+1] ) ;
}
void cauta ( int nod , int p , int u , int x , int y )
{
int m ;
if ( x <= p && u <= y )
{
maxx = max ( maxx , arb[nod] ) ;
return ;
}
m = ( p + u ) / 2 ;
if ( x <= m )
{
cauta ( nod*2 , p , m , x , y ) ;
}
if ( m < y )
{
cauta ( 2*nod+1 , m+1 , u , x , y ) ;
}
}
int main ( )
{
freopen ( "arbint.in" , "r" , stdin ) ;
freopen ( "arbint.out" , "w", stdout ) ;
int n , m , x , i , a , b ;
scanf ( "%d%d" , & n , & m ) ;
for ( i = 1 ; i <= n ; ++ i )
{
scanf ( "%d" , & x ) ;
mod ( 1 , 1 , n , i , x ) ;
}
for ( i = 1 ; i <= m ; ++ i )
{
scanf ( "%d%d%d" , & x , & a , & b ) ;
if ( x )
mod ( 1 , 1 , n , a , b ) ;
else
{
maxx = -1 ;
cauta ( 1 , 1 , n , a , b ) ;
printf ( "%d\n" , maxx ) ;
}
}
return 0 ;
}