#include<cstdio>
#define MAXN ( 1 << 18 )
int i , j , Pos , maxs , Value , a, b, N , M , X , y , Start , End , type ;
int Tree[MAXN];
inline int Max ( int X , int Y ) {
if ( X > Y ) return X;
return Y;
}
void Update ( int nod , int left , int right ) {
int mid = ( left + right ) >> 1;
if ( left == right ) {
Tree[nod] = Value ;
return ;
}
if ( Pos <= mid ) Update ( 2 * nod , left , mid );
else Update ( 2 * nod + 1 , mid + 1 , right ) ;
Tree[nod] = Max ( Tree[2 * nod] , Tree[2 * nod + 1] );
}
void Query ( int nod , int left , int right ) {
int mid = ( left + right ) >> 1;
if( Start <= left && End >= right ) {
if ( Tree[nod] > maxs ) maxs = Tree [nod] ;
return;
}
if ( Start <= mid ) Query ( 2 * nod , left , mid ) ;
if ( End > mid ) Query ( 2 * nod + 1 , mid + 1 , right );
}
int main ()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d" ,&N ,&M);
for( i = 1 ; i <= N ; ++i ) {
scanf("%d" , &X );
Pos = i , Value = X;
Update ( 1 , 1 , N );
}
for( ; M -- ; ) {
scanf("%d %d %d " , &type , &a , &b ) ;
if ( type == 1 ) {
Pos = a , Value = b;
Update ( 1 , 1 , N ) ;
}
else {
maxs = -1;
Start = a , End = b;
Query ( 1 , 1 , N ) ;
printf("%d\n",maxs);
}
}
return 0;
}