#include <bits/stdc++.h>
using namespace std ;
const int NR = 100002 ;
ifstream in ("arbint.in") ;
ofstream out ("arbint.out") ;
vector < int > Tree ( NR << 2 , 0 ) ;
void element_update ( int nod , int st , int dr , int pos , int val )
{
if ( st == dr ) { Tree [ nod ] = val ; return ; }
int mid = ( st + dr ) >> 1 ;
if ( pos <= mid ) element_update( nod << 1 , st , mid , pos , val ) ;
else element_update( nod << 1 | 1 , mid + 1 , dr , pos , val ) ;
Tree [ nod ] = max ( Tree [ nod << 1 ] , Tree [ nod << 1 | 1] ) ;
}
int range_query ( int nod , int st , int dr , int a , int b )
{
if ( a <= st && dr <= b ) return Tree [ nod ] ;
int mid = (st+dr) >> 1 , leftmax = 0 , rightmax = 0 ;
if ( mid >= a ) leftmax = range_query( nod << 1 , st , mid , a , b ) ;
if ( mid < b ) rightmax = range_query( nod << 1 | 1 , mid + 1 , dr , a , b ) ;
Tree [ nod ] = max ( Tree [ nod << 1 ] , Tree [ nod << 1 | 1 ] ) ;
return max ( leftmax , rightmax ) ;
}
int n , m , value , pos , lft , rght , i , type ;
int main ()
{
in >> n >> m ;
for ( i = 1 ; i <= n ; ++ i )
{
in >> value ;
element_update( 1 , 1 , n , i , value ) ;
}
while ( m -- )
{
in >> type ;
if ( type == 0 )
{
in >> lft >> rght ;
out << range_query( 1 , 1 , n , lft , rght ) << '\n' ;
}
else
{
in >> pos >> value ;
element_update( 1 , 1 , n , pos , value ) ;
}
}
}