#include <stdio.h>
#include <stdlib.h>
int v[100000], aint[1<<18+1];
int rez;
int max( int a, int b ) {
if ( a > b )
return a;
return b;
}
void arboreInterval( int st, int dr, int p ) {
if ( st == dr )
aint[p] = v[st];
else {
arboreInterval( st, ( st + dr ) / 2, 2 * p );
arboreInterval( ( st + dr ) / 2 + 1, dr, 2 * p + 1 );
aint[p] = max( aint[2*p], aint[2*p+1] );
}
}
void update( int st, int dr, int p, int poz ) {
if ( st == dr )
aint[p] = v[st];
else {
if ( poz <= ( st + dr ) / 2 )
update( st, ( st + dr ) / 2, 2 * p, poz );
else
update( ( st + dr ) / 2 + 1, dr, 2 * p + 1, poz );
aint[p] = max( aint[2*p], aint[2*p+1] );
}
}
void query( int st, int dr, int p, int a, int b ) {
if ( a <= st && dr <= b )
rez = max( rez, aint[p] );
else {
if ( a <= ( st + dr ) / 2 )
query( st, ( st + dr ) / 2, 2 * p, a, b );
if ( ( st + dr ) / 2 + 1 <= b )
query( ( st + dr ) / 2 + 1, dr, 2 * p + 1, a, b );
}
}
int main() {
FILE *fin, *fout;
int n, m, i, a, b, q;
fin = fopen( "arbint.in", "r" );
fout = fopen( "arbint.out", "w" );
fscanf( fin, "%d%d", &n, &m );
for ( i = 1; i <= n; i++ )
fscanf( fin, "%d", &v[i] );
arboreInterval( 1, n, 1 );
for ( i = 0; i < m; i++ ) {
fscanf( fin, "%d%d%d", &q, &a, &b );
if ( q == 0 ) {
rez = 0;
query( 1, n, 1, a, b );
fprintf( fout, "%d\n", rez );
}
else {
v[a] = b;
update( 1, n, 1, a );
}
}
fclose( fin );
fclose( fout );
return 0;
}