//Vasilut
#include<fstream>
#define NN 100001
const char iname[]="arbint.in";
const char oname[]="arbint.out";
using namespace std;
ofstream out(oname);
int arb[ 4 * NN + 10 ] , n ,m,maxx,position,value;
void read();
void update(int nod,int left,int right);
void query(int nod,int left,int right ,int start,int finish);
int main()
{
read();
return 0;
}
void read()
{
ifstream in(iname);
in >> n >> m;
for(int x,i=1;i<=n;i++)
{
in >> x;
position = i;
value = x;
update(1,1,n);
}
for(int tip,st,dr,i=1 ;i<=m ; i++ )
{
in >> tip >> st >> dr;
if ( tip == 0 )
{
maxx = -1;
query(1,1,n,st,dr);
out << maxx <<'\n';
}
else
if ( tip == 1 )
{
position = st;
value = dr;
update(1,1,n);
}
}
}
void update(int nod,int left,int right)
{
if ( left == right )
{
arb[nod] = value;
return;
}
int mid = (left + right ) >> 1;
if ( position <= mid )
update( nod << 1 ,left,mid);
else
update( ( nod << 1 ) + 1 , mid+1,right);
arb[nod] = max ( arb[ nod << 1] ,arb[ ( nod << 1 ) + 1] );
}
void query(int nod,int left,int right,int start,int finish)
{
if ( start <= left && finish >=right )
{
if ( arb[nod] > maxx )
maxx = arb[nod];
return;
}
int mid = ( left + right ) >> 1;
if ( start<= mid )
query( nod << 1 , left, mid , start,finish );
if ( mid < finish )
query( ( nod << 1 ) + 1 , mid+1,right,start,finish );
}