#include <bits/stdc++.h>
using namespace std;
#define MAXN 100000
int v[MAXN + 1];
int aint[MAXN * 4 + 1];
void build( int l , int r , int node ) {
if( l != r ) {
int mid = ( l + r ) / 2;
build( l , mid , 2 * node );
build( mid + 1 , r , 2 * node + 1 );
aint[node] = max( aint[2 * node] , aint[2 * node + 1] );
} else
aint[node] = v[l];
}
void update( int node , int l , int r , int pos , int val ) {
int mid = ( l + r ) / 2;
if( l == r ) {
aint[node] = val;
return;
}
if( mid >= pos )
update( node * 2 , l , mid , pos , val );
else
update( node * 2 + 1 , mid + 1 , r , pos , val );
aint[node] = max( aint[node * 2] , aint[node * 2 + 1] );
}
int query( int node , int from , int to , int l , int r ) {
int ans = 0;
if( l <= from && to <= r )
return aint[node];
int mid = ( from + to ) / 2;
if( l <= mid ) {
int s = query( node * 2 , from , mid , l , r );
ans = max( ans , s );
}
if( mid + 1 <= r ) {
int s = query( 2 * node + 1 , mid + 1 , to , l , r );
ans = max( ans , s );
}
return ans;
}
int main() {
ifstream cin( "arbint.in" );
ofstream cout( "arbint.out" );
int l , r , a , b , tip , n , q , i;
cin >> n >> q;
for( i = 1 ; i <= n ; i++ )
cin >> v[i];
build( 1 , n , 1 );
for( i = 0 ; i < q ; i++ ) {
cin >> tip >> a >> b;
if( tip == 0 )
cout << query( 1 , 1 , n , a , b ) << '\n';
else
update( 1 , 1 , n , a , b );
}
return 0;
}