#include <stdio.h>
#define nmax 100000
FILE *fin, *fout;
int v[nmax], aint[131072], n, a, b, max;
int maxim( int a, int b ){
return (a >= b ) ? a : b;
}
void generare( int poz, int st, int dr ){
if( st==dr )
aint[poz] = v[st];
else{
int mij = ( st + dr ) / 2;
generare( poz*2, st, mij );
generare( poz*2+1, mij+1, dr );
aint[poz] = maxim( aint[poz*2], aint[poz*2+1] );
}
}
void cauta( int poz, int st, int dr ){
if( st>=a && dr<=b )
max = maxim( max, aint[poz] );
else{
int mij = ( st + dr ) / 2;
if( mij>=a ){
cauta( poz*2, st, mij );
// max = maxim( max, aint[poz*2] );
}
if( mij<b ){
cauta( poz*2+1, mij+1, dr );
// max = maxim( max, aint[poz*2+1] );
}
}
}
void update( int poz, int st, int dr ){
if( st==dr )
aint[poz] = b;
else{
int mij = ( st + dr ) / 2;
if( mij >= a ){
update( poz*2, st, mij );
aint[poz] = maxim( aint[poz*2], aint[poz*2+1] );
}
else{
update( poz*2+1, mij+1, dr );
aint[poz] = maxim( aint[poz*2], aint[poz*2+1] );
}
}
}
int main()
{
int m, i, ver;
fin = fopen( "arbint.in", "r" );
fout = fopen( "arbint.out", "w" );
fscanf( fin, "%d%d", &n, &m );
for( i=1; i<=n; i++ )
fscanf( fin, "%d", &v[i] );
generare( 1, 1, n );
for( i=0; i<m; i++ ){
fscanf( fin, "%d%d%d", &ver, &a, &b );
if( ver==0 ){
max = 0;
cauta( 1, 1, n );
fprintf( fout, "%d\n", max );
}
else{
update( 1, 1, n );
}
}
fclose( fin );
fclose( fout );
return 0;
}