#include <cstdio>
#include <cstdlib>
int max[500000];
int N,M,aaa;
int maxim ( int a , int b )
{
if ( a > b ) return a;
else return b;
}
void update ( int nod , int st , int dr , int pos , int val )
{
if ( st == dr ) max[nod] = val;
else
{
int mij = ( st + dr )/2;
if ( pos <= mij ) update ( nod*2 , st , mij , pos , val );
else update ( nod*2+1 , mij + 1 , dr , pos , val );
max[nod] = maxim ( max[2*nod] , max[2*nod+1] );
}
}
void qasd ( int nod , int a , int b , int st ,int dr )
{
if ( a <= st && dr <= b )
{
aaa = max[nod];
return;
}
else
{
int mid = ( st + dr )/2;
if ( a <= mid ) qasd ( 2*nod , a , b , st , mid );
else if ( mid < b ) qasd ( 2*nod+1 , a , b , mid+1 , dr );
}
}
int main ()
{
FILE *fin,*fout;
fin = fopen ( "arbint.in" , "r" );
fout = fopen ( "arbint.out" , "w" );
fscanf ( fin , "%d %d" , &N , & M );
int asd;
for ( int i = 1 ; i <= N ; i++ )
{
fscanf ( fin , "%d" , &asd );
update ( 1 , 1 , N , i , asd );
}
int op , a , b;
for ( int i = 1 ; i <= M ; i++ )
{
fscanf ( fin , "%d %d %d" , &op , &a , &b );
if ( op == 0 )
{
qasd ( 1 , a , b , 1 , N );
fprintf ( fout , "%d\n" , aaa );
continue;
}
if ( op == 1 )
update ( 1 , 1 , N , a , b );
}
fclose( fin );
fclose ( fout );
return 0;
}