#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 , INF = 1e9 + 1;
int aint[4 * MAXN];
void update ( int nod , int st , int dr , int poz , int val ) {
if ( st == dr ) {
aint[nod] = val;
return;
}
int mij = ( st + dr ) / 2;
if ( poz <= mij )
update ( 2 * nod , st , mij , poz , val );
if ( poz > mij )
update ( 2 * nod + 1 , mij + 1 , dr , poz , val );
aint[nod] = max ( aint[2 * nod] , aint[2 * nod + 1] );
}
int query ( int nod , int st , int dr , int stq , int drq ) {
if ( stq <= st && dr <= drq )
return aint[nod];
int mij = ( st + dr ) / 2 , ans = -INF;
if ( stq <= mij )
ans = max ( ans , query ( 2 * nod , st , mij , stq , drq ) );
if ( drq > mij )
ans = max ( ans , query ( 2 * nod + 1 , mij + 1 , dr , stq , drq ) );
return ans;
}
int main( ) {
ifstream fin ( "arbint.in" );
ofstream fout ( "arbint.out" );
int n , m , i , a , op , b , c;
fin >> n >> m;
for ( i = 1 ; i <= n ; i++ ) {
fin >> a;
update ( 1 , 1 , n , i , a );
}
for ( i = 1 ; i <= m ; i++ ) {
fin >> op >> b >> c;
if ( op == 0 )
fout << query ( 1 , 1 , n , b , c ) << '\n';
else
update ( 1 , 1 , n , b , c );
}
return 0;
}