#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("arbint.in") ;
ofstream fout ("arbint.out") ;
const int MAXN=100041 ;
int n , m ;
int a[MAXN] , arbint[4*MAXN] ;
void citire()
{
fin>>n>>m ;
for(int i=1 ; i<=n ; i++)
fin>>a[i] ;
}
void constructie(int st=1 , int dr=n , int nod=1)
{
if(st==dr)
arbint[nod]=a[st] ;
else
{
int mij=(st+dr)/2 ;
constructie(st,mij,nod*2) ;
constructie(mij+1,dr,nod*2+1) ;
arbint[nod]=max(arbint[nod*2] , arbint[nod*2+1]) ;
}
}
void update(int pos , int val , int st=1 , int dr=n , int nod=1)
{
if(st==dr)
{
arbint[nod]=val ;
}
else
{
int mij=(st+dr)/2 ;
if(pos<=mij)
update(pos,val,st,mij,2*nod) ;
else
update(pos,val,mij+1,dr,2*nod+1) ;
arbint[nod]=max(arbint[nod] , arbint[2*nod+1]) ;
}
}
int query(int qst , int qdr , int st=1 , int dr=n , int nod=1)
{
if(qst<=st && dr<=qdr)
return arbint[nod] ;
int mij=(st+dr)/2 ;
if(qdr<=mij)
return query(qst,qdr,st,mij,nod*2) ;
if(qst>=mij+1)
return query(qst,qdr,mij+1,dr,nod*2+1) ;
return max(query(qst,qdr,st,mij,nod*2) , query(qst,qdr,mij+1,dr,nod*2+1)) ;
}
int main()
{
citire() ;
constructie(1,n) ;
for(int i=1 ; i<=m ; i++)
{
int op , a , b ;
fin>>op>>a>>b ;
if(op==0)
fout<<query(a,b)<<"\n" ;
else
update(a,b) ;
}
return 0;
}