#include <stdio.h>
#include <algorithm>
const int MAXN = (1 << 17);
int aint[2 * MAXN];
int aintn;
void init( int n ) {
aintn = 1;
while( aintn < n )
aintn <<= 1;
}
void pull( int i ) {
aint[i] = std::max( aint[i * 2 + 1], aint[i * 2 + 2] );
}
void build() {
for( int i = aintn - 1; i--; )
pull( i );
}
void update( int idx, int val ) {
idx += aintn - 1;
aint[idx] = val;
while( idx ){
idx = (idx - 1) >> 1;
pull( idx );
}
}
int query( int st, int dr ) {
int ret = 0;
st += aintn - 1;
dr += aintn - 1;
while( st < dr ){
if( !(st & 1) ) ret = std::max( ret, aint[st++] );
if( dr & 1 ) ret = std::max( ret, aint[dr--] );
st = (st - 1) >> 1;
dr = (dr - 1) >> 1;
}
if( st == dr )
ret = std::max( ret, aint[st] );
return ret;
}
int main() {
FILE *fin = fopen( "arbint.in", "r" );
FILE *fout = fopen( "arbint.out", "w" );
int n, m;
fscanf( fin, "%d%d", &n, &m );
init( n );
for( int i = 0; i < n; i++ )
fscanf( fin, "%d", &aint[aintn - 1 + i] );
build();
for( int i = 0; i < m; i++ ){
int task, a, b;
fscanf( fin, "%d%d%d", &task, &a, &b );
if( task == 0 )
fprintf( fout, "%d\n", query( --a, --b ) );
else
update( --a, b );
}
fclose( fin );
fclose( fout );
return 0;
}