#include <iostream>
#include <cstdio>
using namespace std;
int n , m , v[100007] , poz , aint[100007<<2] , sol , a , b ;
void create ( int nod , int st , int dr )
{
if ( st == dr )
{
aint[nod]=v[st] ;
return;
}
int mij = (st+dr)/2 ;
create ( nod*2 , st , mij ) ;
create ( nod*2+1 , mij+1 , dr ) ;
aint[nod]=max(aint[nod*2] , aint[nod*2+1] ) ;
}
void update ( int nod , int st , int dr )
{
if ( st == dr )
{
aint[nod]=b;
return;
}
int mij = (st+dr)/2 ;
if ( poz <= mij )update( nod*2 , st , mij ) ;
else
update ( nod*2+1 , mij+1 ,dr ) ;
aint[nod]=max(aint[nod*2] , aint[nod*2+1] ) ;
}
void query (int nod , int st , int dr )
{
if ( a <= st and dr <=b )
{
sol = max(sol , aint[nod] ) ;
return;
}
int mij = ( st + dr)/2;
if ( a <= mij )
query( nod*2 , st , mij ) ;
if ( b > mij )
query( nod*2+1 , mij+1 , dr ) ;
}
int main()
{
freopen ("arbint.in" , "r" , stdin ) ;
freopen ("arbint.out" , "w" , stdout ) ;
scanf ("%d %d" , &n , &m ) ;
for ( int i = 1 ; i <= n ; ++i )
scanf ("%d" , &v[i] ) ;
create ( 1 , 1 , n ) ;
for ( int i = 1 ; i <= m ; ++i )
{
int x , y , z ;
scanf ("%d%d%d" , &x , &y , &z ) ;
if ( x == 0 )
{
sol=0;
a=y;
b=z;
query ( 1 , 1 , n );
printf ("%d\n" , sol );
}
if ( x == 1 )
{
poz = y ;
b = z ;
update ( 1 , 1 , n ) ;
}
}
return 0;
}