#include <fstream>
using namespace std;
ifstream fin ( "arbint.in" );
ofstream fout ( "arbint.out" );
const int NMAX = 1e5;
int v[NMAX + 1];
int aint[4 * NMAX + 1];
int poz, val;
void build ( int nod, int st, int dr ) {
if ( st == dr )
aint[nod] = v[st];
else {
int mij = ( st + dr ) / 2;
build ( 2 * nod, st, mij );
build ( 2 * nod + 1, mij + 1, dr );
aint[nod] = max ( aint[2 * nod], aint[2 * nod + 1] );
}
}
void update ( int nod, int st, int dr ) {
int mij = ( st + dr ) / 2;
if ( st == dr )
aint[nod] = val;
else {
if ( poz <= mij )
update ( 2 * nod, st, mij );
else
update ( 2 * nod + 1, mij + 1, dr );
aint[nod] = max ( aint[2 * nod], aint[2 * nod + 1] );
}
}
int query ( int nod, int l, int r, int st, int dr ) {
if ( l == st && r == dr )
return aint[nod];
int mij = ( st + dr ) / 2;
if ( r <= mij )
return query ( 2 * nod, l, r, st, mij );
if ( l > mij )
return query ( 2 * nod + 1, l, r, mij + 1, dr );
return max ( query ( 2 * nod, l, mij, st, mij ),
query ( 2 * nod + 1, mij + 1, r, mij + 1, dr ) );
}
int main () {
int n, m, t, a, b;
fin >> n >> m;
for ( int i = 1; i <= n; i++ )
fin >> v[i];
build ( 1, 1, n );
for ( int i = 1; i <= m; i++ ) {
fin >> t >> a >> b;
if ( t == 0 ) {
fout << query ( 1, a, b, 1, n ) << '\n';
} else {
poz = a; val = b;
update ( 1, 1, n );
}
}
return 0;
}