#include <cstdio>
#include <algorithm>
#include <assert.h>
const int MAX = 100000;
using namespace std;
int v[4 * MAX + 5];
int my_max;
void update ( int nod, int st, int dr, int poz, int val ) {
if ( st == dr ) {
v[nod] = val;
return;
}
int mid = ( st + dr ) / 2;
if ( mid < poz )
update ( 2 * nod + 1, mid + 1, dr, poz, val );
else
update ( 2 * nod, st, mid, poz, val );
v[nod] = max ( v[2*nod], v[2*nod+1] );
}
void query ( int nod, int st, int dr, int a, int b ) {
int mid = (st + dr) / 2;
if ( a <= st && dr <= b ) {
my_max = max ( my_max, v[nod] );
return;
}
if ( a <= mid )
query ( 2 * nod, st, mid, a, b );
if ( b > mid )
query ( 2 * nod + 1, mid + 1, dr, a, b );
}
int main() {
freopen ( "arbint.in", "r", stdin );
freopen ( "arbint.out", "w", stdout );
int n, m, i, op, x, y;
scanf ( "%d%d", &n, &m );
for ( i = 1 ; i <= n ; ++ i ) {
scanf ( "%d", &x );
update ( 1, 1, n, i, x );
}
for( i = 1 ; i <= m ; i ++ ) {
scanf ( "%d%d%d", &op, &x, &y );
if ( op == 0 ) {
my_max = 0;
query ( 1, 1, n, x, y );
printf ("%d\n", my_max );
}
else
update ( 1, 1, n, x, y );
}
return 0;
}