#include <stdio.h>
#define MAX_N 100000
int v[MAX_N];
int max( int a, int b ) {
return a > b ? a : b;
}
struct AINT {
int aint[4 * MAX_N + 1];
void init( int nod, int l, int r ) {
int mid;
mid = (l + r) / 2;
if ( l == r ) {
aint[nod] = v[l];
return;
}
init( nod * 2 + 1, l, mid );
init( nod * 2 + 2, mid + 1, r );
aint[nod] = max( aint[nod * 2 + 1], aint[nod * 2 + 2] );
}
int query( int nod, int l, int r, int lq, int rq ) {
int mid;
mid = (l + r) / 2;
if ( l > rq || r < lq )
return 0;
if ( lq <= l && r <= rq )
return aint[nod];
return max( query( nod * 2 + 1, l, mid, lq, rq ), query( nod * 2 + 2, mid + 1, r, lq, rq ) );
}
void update( int nod, int l, int r, int p, int x ) {
int mid;
mid = (l + r) / 2;
if ( l > p || r < p )
return;
if ( l == r ) {
aint[nod] = x;
return;
}
update( nod * 2 + 1, l, mid, p, x );
update( nod * 2 + 2, mid + 1, r, p, x );
aint[nod] = max( aint[nod * 2 + 1], aint[nod * 2 + 2] );
}
};
AINT arb;
int main() {
FILE *fin, *fout;
int n, q, tip, a, b, i;
fin = fopen( "arbint.in", "r" );
fscanf( fin, "%d%d", &n, &q );
for ( i = 0; i < n; i++ )
fscanf( fin, "%d", &v[i] );
arb.init( 0, 0, n - 1 );
fout = fopen( "arbint.out", "w" );
for ( i = 0; i < q; i++ ) {
fscanf( fin, "%d%d%d", &tip, &a, &b );
if ( tip == 0 )
fprintf( fout, "%d\n", arb.query( 0, 0, n - 1, a - 1, b - 1 ) );
else
arb.update( 0, 0, n - 1, a - 1, b );
}
fclose( fin );
fclose( fout );
return 0;
}