#include <cstdio>
#include <algorithm>
using namespace std;
#define IN "arbint.in"
#define OUT "arbint.out"
int st[400004] , a[100003];
int INF = 83930212;
struct element
{
int val , st ,dr;
}v[800004];
bool Partial_Overlap(int x , int y , int a , int b)
{
if ( ( x <= b && x >= a ) or ( y >= a && y <= b) or ( a >= x && a <= y) or ( b >= x && b <= y) )
return 1;
return 0;
}
bool Total_Overlap(int x , int y , int a , int b)
{
if ( x >= a && y <= b )
return 1;
return 0;
}
int n , m;
void Build()
{
int noduri , nr , i;
noduri = 2*n-1;
nr = 1;
v[1].st = 1 , v[1].dr = n;
for ( i = 1 ; i <= 4*n && nr < noduri ; i ++)
if(v[i].st != v[i].dr && v[i].st != 0 && v[i].dr != 0 ){
v[i*2].st = v[i].st , v[i*2].dr = (v[i].st+v[i].dr)/2;
if ( v[i*2].st == v[i*2].dr )
v[i*2].val = a[v[i*2].st];
v[i*2+1].st = (v[i].st+v[i].dr)/2+1 , v[i*2+1].dr = v[i].dr , nr += 2;
if( v[i*2+1].st == v[i*2+1].dr )
v[i*2+1].val = a[v[i*2+1].st];
}
for ( i = 4*n ; i >= 1 ; i -- )
if ( v[i].st != 0 && v[i-1].st != 0 )
v[i/2].val = max(v[i].val,v[i-1].val) , i --;
}
int main()
{
int i , vf , x , y , V , t , j , sol = 0 , nod;
bool ok;
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf ( "%d%d" , &n , &m );
for ( i = 1 ; i <= n ; i ++ )
scanf ( "%d" , &a[i] );
Build();
for ( i = 1 ; i <= m ; i ++ ){
scanf ( "%d" , &V );
scanf ( "%d%d" , &x , &y );
if ( V == 0 )
{
ok = 0;
vf = 1;
st[vf] = 1;
while( 1 == 1 && vf > -1 )
{
t = st[vf];
vf--;
if (Total_Overlap(v[t].st , v[t].dr , x , y)){
if ( ok == 0 )
sol = v[t].val , ok = 1;
else {printf ( "%d\n" , max(sol,v[t].val));
break;}
}
else if (Partial_Overlap(v[t].st , v[t].dr , x , y))
st[++vf] = t*2 , st[++vf] = t*2+1;
if ( vf == 0 ){
printf ("%d\n" , sol );
break;}
}
}
else
{
ok = 0;
vf = 1;
st[vf] = 1;
while ( 1 == 1 && vf > -1 )
{
t = st[vf];
vf--;
if(Total_Overlap(v[t].st,v[t].dr,x,x)){
nod = t;
break;
}
else if ( Partial_Overlap(v[t].st,v[t].dr,x,x))
st[++vf] = t*2 , st[++vf] = t*2+1;
}
v[nod].val = y;
while(nod != 1)
{
if ( nod%2 == 0 )
v[nod/2].val = max(v[nod].val,v[nod+1].val);
else v[nod/2].val = max(v[nod].val,v[nod-1].val);
nod /= 2;
}
}
}
}