#include <cstdio>
#define MAXN 100001
inline int maximum( int a, int b ) {
return a > b ? a : b;
}
class SegmentTree {
public:
int size;
int nodes[MAXN];
inline void setSize( int n ) {
size = n;
}
void update( int node, int left, int right, int index, int value ) {
if( left == right ) {
nodes[node] = value;
return;
}
int mid = ( left + right ) >> 1;
if( index <= mid )
update( node << 1, left, mid, index, value );
if( index > mid )
update( ( node << 1 ) + 1, mid + 1, right, index, value );
nodes[node] = maximum( nodes[node<<1], nodes[(node<<1)+1] );
}
int query( int node, int left, int right, int l, int r ) {
if( l <= left && r >= right )
return nodes[node];
int mid = ( left + right ) / 2;
int max = -1;
if( l <= mid )
max = query( node << 1, left, mid, l, r );
if( r > mid ) {
int poss = query( ( node << 1 ) + 1, mid + 1, right, l, r );
max = maximum( max, poss );
}
return max;
}
};
SegmentTree T;
int main () {
FILE *f, *g;
f = fopen( "arbint.in", "r" );
g = fopen( "arbint.out", "w" );
int N, M, X, a, b, op;
fscanf( f, "%d%d", &N, &M );
T.setSize(N);
for( int i = 1 ; i <= N ; ++i ) {
fscanf( f, "%d", &X );
T.update( 1, 1, N, i, X );
}
for( int i = 0 ; i < M ; ++i ) {
fscanf( f, "%d%d%d", &op, &a, &b );
if( op == 0 )
fprintf( g, "%d\n", T.query( 1, 1, N, a, b ) );
else
T.update( 1, 1, N, a, b );
}
fclose( f );
fclose( g );
return 0;
}