#include <stdio.h>
#define NX (1<<17)
#define TX (1<<18)
int a[ NX ], T[ TX ], N, M, X, Y;
void build( int n, int l, int r ) {
if( l==r )
T[n] = l;
else {
int st = n<<1, m = (l+r)>>1;
build( st, l, m );
build( st+1, m+1, r );
T[n] = ( a[ T[st] ] >= a[ T[st+1] ] ) ? T[st] : T[st+1];
}
}
void upd( int n, int l, int r ) {
if( l==r )
a[X] = Y;
else {
int st = n<<1, m = (l+r)>>1;
if( X <= m )
upd( st, l, m );
else
upd( st+1, m+1, r );
T[n] = ( a[ T[st] ] >= a[ T[st+1] ] ) ? T[st] : T[st+1];
}
}
int que( int n, int l, int r ) {
if( X <= l && r <= Y )
return T[n];
else {
int st = n<<1, m = (l+r)>>1, p1, p2;
p1 = p2 = 0;
if( X <= m )
p1 = que( st, l, m );
if( m < Y )
p2 = que( st+1, m+1, r );
return ( a[p1] >= a[p2] ) ? p1 : p2;
}
}
int main() {
int i, op;
freopen( "arbint.in", "r", stdin );
freopen( "arbint.out", "w", stdout );
scanf( "%d%d", &N, &M );
for( i = 1; i <= N; i++ )
scanf( "%d", a+i );
build( 1, 1, N );
while( M-- ) {
scanf( "%d%d%d", &op, &X, &Y );
if( op )
upd( 1, 1, N );
else
printf( "%d\n", a[ que(1, 1, N) ] );
}
return 0;
}