#include <cstdio>
#include <algorithm>
using namespace std;
#define Nmax 200002
#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];
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 x1 = -1, x2 = -1;
if ( a <= mid )
x1 = Query ( L ( nod ), st, mid, a, b );
if ( b > mid )
x2 = Query ( R ( nod ), mid + 1, dr, a, b );
return max ( x1, x2 );
}
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 main(){
int N, M, op, a, b, x;
fscanf ( f, "%d%d", &N, &M );
for ( int i = 1; i <= N; ++i ){
fscanf ( f, "%d", &x );
Update ( 1, 1, N, i, x );
}
for ( int i = 1; i <= M; ++i ){
fscanf ( f, "%d%d%d", &op, &a, &b );
if ( op == 0 )
fprintf ( g, "%d\n", Query ( 1, 1, N, a, b ) );
else
Update ( 1, 1, N, a, b );
}
return 0;
}