#include<bits/stdc++.h>
using namespace std;
const int NMAX = 100005;
int v[4*NMAX],val,poz;
int fiuStanga ( int i ){ return i * 2; }
int fiuDreapta ( int i ) { return i * 2 + 1; }
void build ( int nod , int val , int a , int b , int nodjos )
{
if ( a == b ){
v[nod] = val;
return;
}
int mij = ( a + b ) / 2;
if ( nodjos <= mij ){
build(fiuStanga(nod) , val , a , mij , nodjos);
}
else{
build(fiuDreapta(nod) , val , mij + 1 , b , nodjos);
}
v[nod] = max(v[fiuDreapta(nod)],v[fiuStanga(nod)]);
}
void afisare( int n )
{
for ( int i = 1 ; i <= n ; i++ ){
cout<<v[i]<<" ";
}
}
int query ( int nod , int st , int dr , int a , int b ){
if ( st > b ) return -1;
if ( dr < a ) return -1;
if ( st >= a && dr <= b ){
return v[nod];
}
return max(query(fiuStanga(nod),st,(st+dr)/2,a,b),query(fiuDreapta(nod),(st+dr)/2+1,dr,a,b));
}
ifstream in ( "arbint.in" );
ofstream out ( "arbint.out" );
int main()
{
int n;
int m;
in>>n>>m;
for ( int i = 1 ; i <= n ; i++ ){
int nr;
in>>nr;
build(1,nr,1,n,i);
}
for ( int i = 1 ; i <= m ; i++ ){
int p , a , b;
in>>p>>a>>b;
if ( p == 1 ){
build(1,b,1,n,a);
}
if ( p == 0 ){
out<<query(1,1,n,a,b)<<'\n';
}
}
return 0;
}