#include <stdio.h>
#include <stdlib.h>
int N , M ;
int arb[20000000] , op , a , b , aux ;
int max ( int a , int b )
{
if ( a < b ) return b;
else return a ;
}
void update ( int nod , int stanga , int dreapta )
{
if ( stanga == dreapta ) arb[nod] = b;
else
{
int mid = ( stanga + dreapta )/2 ;
if ( a <= mid ) update ( 2*nod , stanga , mid );
else update ( 2*nod + 1 , mid + 1 , dreapta );
arb[nod] = max ( arb[2*nod] , arb[2*nod + 1 ] );
}
}
void query ( int nod , int stanga , int dreapta )
{
if ( a <= stanga && dreapta <= b )
aux = max ( aux , arb[nod] );
else
{
int mid = ( stanga + dreapta ) / 2;
if ( a <= mid ) query ( 2*nod , stanga , mid );
if ( mid < b ) query ( 2*nod + 1 , mid + 1 , dreapta );
}
}
int main ()
{
FILE *fin , *fout ;
fin = fopen ( "arbint.in" , "rt" );
fout = fopen ( "arbint.out" , "wt" );
fscanf ( fin , "%d %d " , &N , &M );
for ( int i = 1 ; i <= N ; i++ )
{
fscanf ( fin , "%d" , &b );
a = i ;
update ( 1 , 1 , N );
}
for ( int i = 1 ; i <= M ; i++ )
{
fscanf ( fin , "%d %d %d " , &op , &a , &b );
if ( !op )
{
aux = 0;
query ( 1 , 1 , N );
fprintf ( fout , "%d\n" , aux );
printf ( "%d\n" , aux );
}
else update ( 1 , 1 , N );
}
fclose ( fin );
fclose ( fout );
return 0 ;
}