#include <stdio.h>
#define NX 131072
#define INF 0x3f3f3f3f
int N, v[ NX ], T[ NX*2 ], x, y;
inline int max( int x, int y ) {
return x > y ? x : y;
}
void build( int n, int l, int r ) {
int nn, m;
if( l == r )
T[n] = v[l];
else {
m = (l+r) >> 1; nn = n << 1;
build( nn, l, m );
build( nn + 1, m+1, r );
T[ n ] = max( T[nn], T[nn + 1] );
}
}
void upd( int n, int l, int r ) {
int m, nn;
if( l == r )
T[n] = y;
else {
m = (l + r) >> 1; nn = n << 1;
if( x <= m )
upd( nn, l, m );
else
upd( nn+1, m+1, r );
T[ n ] = max( T[ nn ], T[ nn+1 ] );
}
}
int query( int n, int l, int r ) {
int m, nn, q;
if( l >= x && r <= y )
return T[n];
else {
m = (l+r) >> 1; nn = n << 1;
q = -INF;
if( m >= x )
q = max( q, query( nn, l, m ) );
if( m < y )
q = max( q, query( nn+1, m+1, r ) );
return q;
}
}
void cit() {
int M, i, op;
scanf( "%d%d", &N, &M );
for( i = 1; i <= N; i++ )
scanf( "%d", v+i );
build( 1, 1, N );
while( M-- ) {
scanf( "%d%d%d", &op, &x, &y );
if( op == 1 )
upd( 1, 1, N );
else
printf( "%d\n", query( 1, 1, N ) );
}
}
int main() {
freopen( "arbint.in", "r", stdin );
freopen( "arbint.out", "w", stdout );
cit();
return 0;
}