#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX_N 100000
#define IN_FILE "arbint.in"
#define OUT_FILE "arbint.out"
int N, M;
int aint[ MAX_N << 2 ];
int ans;
void update( const int &nod, const int &st, const int &dr, const int &poz, const int &val ) {
if( st == dr ) {
aint[ nod ] = val;
return ;
}
int mid = st + ( ( dr - st ) >> 1 );
if( poz <= mid )
update( nod << 1, st, mid, poz, val );
else
update( ( nod << 1 ) + 1, mid + 1, dr, poz, val );
aint[ nod ] = max( aint[ nod << 1 ], aint[ ( nod << 1 ) + 1 ] );
}
void query( const int &nod, const int &st, const int &dr, const int &x, const int &y ) {
if( x <= st && y >= dr ) {
if( aint[ nod ] > ans )
ans = aint[ nod ];
return;
}
int mid = st + ( ( dr - st ) >> 1 );
if( x <= mid )
query( nod << 1, st, mid, x, y );
if( y > mid )
query( ( nod << 1 ) + 1, mid + 1, dr, x, y );
}
int main( ) {
FILE *f, *g;
int i, x, y, op;
f = fopen( IN_FILE, "r" );
fscanf( f, "%d%d", &N, &M );
for( i = 0; i != N; ++i ) {
fscanf( f, "%d", &x );
update( 1, 1, N, i + 1, x );
}
g = fopen( OUT_FILE, "w" );
for( i = 0; i != M; ++i ) {
fscanf( f, "%d%d%d", &op, &x, &y );
if( !op ) {
ans = 0;
query( 1, 1, N, x, y );
fprintf( g, "%d\n", ans );
} else
update( 1, 1, N, x, y );
}
fclose( f );
fclose( g );
return 0;
}