#include <cstdio>
#include <algorithm>
using namespace std;
#define NMAX 100002
int v[NMAX],arb[3*NMAX];
int n,m,k,r;
void construct(int nod,int lf,int rt){
if(lf==rt){
arb[nod]=v[++k];
return ; }
int md=(lf+rt)/2;
construct(2*nod,lf,md);
construct(2*nod+1,md+1,rt);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
void update(int nod,int lf,int rt,int pos,int val){
if(lf==rt){
arb[nod]=val;
return ; }
int md=(lf+rt)/2;
if(pos<=md)update(2*nod,lf,md,pos,val); else
update(2*nod+1,md+1,rt,pos,val);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
//try ON [x,y]
void query(int nod,int lf,int rt,int x,int y){
if(x<=lf&&rt<=y){
r=max(r,arb[nod]);
return ; }
int md=(lf+rt)/2;
if(x<=md)query(2*nod,lf,md,x,y);
if(md<y)query(2*nod+1,md+1,rt,x,y);
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&v[i]);
construct(1,1,n);
for(int i=1;i<=m;i++){
int cod,a,b;
scanf("%d %d %d",&cod,&a,&b);
if(cod==0){
r=0;
query(1,1,n,a,b);
printf("%d\n",r); } else
update(1,1,n,a,b); }
// for(int i=1;i<=n;i++)printf("%d ",arb[i]);
}