#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 1 << 19
#define L(x) ( (x) << 1 )
#define R(x) ( (x) << 1 ) + 1
FILE *f = fopen ( "arbint.in", "r" );
FILE *g = fopen ( "arbint.out", "w" );
int Aint[Nmax];
void Update ( int nod, int st, int dr, int poz, int val ){
if ( st >= poz && dr <= poz ){
Aint[nod] = val;
return;
}
int mid = ( st + dr ) >> 1;
if ( poz <= mid )
Update ( L(nod), st, mid, poz, val );
else
Update ( R(nod), mid + 1, dr, poz, val );
Aint[nod] = max ( Aint[L(nod)], Aint[R(nod)] );
}
int Query ( int nod, int st, int dr, int a, int b ){
if ( a <= st && dr <= b )
return Aint[nod];
int mid = ( st + dr ) >> 1;
int t1 = -1, t2 = -1;
if ( a <= mid )
t1 = Query ( L(nod), st, mid, a, b );
if ( b > mid )
t2 = Query ( R(nod), mid + 1, dr, a, b );
return max ( t1, t2 );
}
int main(){
int N, M, x, y, t;
fscanf ( f, "%d%d", &N, &M );
for ( int i = 1; i <= N; ++i ){
fscanf ( f, "%d", &x );
Update ( 1, 1, N, i, x );
}
for ( ; M ; --M ){
fscanf ( f, "%d%d%d", &t, &x, &y );
if ( !t )
fprintf ( g, "%d\n", Query ( 1, 1, N, x, y ) );
else
Update ( 1, 1, N, x, y );
}
return 0;
}