#include <stdio.h>
#define ARB_MAX 2000000
int arb[ ARB_MAX ];
int max ( int a, int b ){
if ( a > b ) return a;
return b;
}
void update ( int st, int dr, int pozc, int poz, int nr ){
if ( st == poz && dr == poz ){
arb[ pozc ] = nr;
return ;
}
int mijl = ( st + dr ) / 2;
if ( mijl >= poz ){
update ( st, mijl, pozc * 2 + 1, poz, nr );
}
else{
update ( mijl + 1, dr, pozc * 2 + 2, poz, nr );
}
arb[ pozc ] = max ( arb[ pozc * 2 + 1 ], arb[ pozc * 2 + 2 ] );
return ;
}
int query ( int st, int dr, int n, int pozc, int cst, int cdr ){
if ( st <= cst && dr >= cdr || cst == cdr ) return arb[ pozc ];
int mijl = ( cst + cdr ) / 2, maxc = 0;
if ( st <= mijl ) maxc = max ( maxc, query ( st, dr, n, pozc * 2 + 1, cst, mijl ));
if ( dr > mijl ) maxc = max ( maxc, query ( st, dr, n, pozc * 2 + 2, mijl + 1, cdr ) );
return maxc;
}
int main()
{
FILE *in = fopen ( "arbint.in", "r" );
int n, m;
fscanf ( in, "%d%d", &n, &m );
int i, a;
for ( i = 0; i < n; i++ ){
fscanf ( in, "%d", &a );
update ( 0, n - 1, 0, i, a );
}
FILE *out = fopen ( "arbint.out", "w" );
int b, c, rez;
for( i = 0; i < m; i++ ){
fscanf ( in, "%d%d%d", &a, &b, &c );
b--;
if ( a == 1 ){
update ( 0, n - 1, 0, b, c );
}
else{
c--;
rez = query ( b, c, n - 1, 0, 0, n - 1 );
fprintf ( out, "%d\n", rez );
}
}
fclose ( in );
fclose ( out );
return 0;
}