//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;
void read();
void update(int nod,int left,int right,int position,int value);
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;
update(1,1,n,i,x);
}
for(int tip,st,dr ; m ; --m )
{
in >> tip >> st >> dr;
if ( tip == 0 )
{
maxx = -1;
query(1,1,n,st,dr);
out << maxx <<'\n';
}
else
if ( tip == 1 )
{
update(1,1,n,st,dr);
}
}
}
void update(int nod,int left,int right,int position,int value)
{
if ( left == right )
{
arb[nod] = value;
return;
}
int mid = (left + right ) >> 1;
if ( position <= mid )
update( nod << 1 ,left,mid,position,value);
else
update( ( nod << 1 ) + 1 , mid+1,right,position,value);
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 )
{
maxx = max ( arb[nod] ,maxx );
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 );
}