#include <stdio.h>
#include <stdlib.h>
#define MAXN 100001
int v[4*MAXN],maxim;
inline int max(int a,int b){
if(a>b) return a;
return b;
}
void update(int nod,int l,int r,int x,int poz){
int mij;
if(l==r)
v[nod]=x;
else{
mij=(l+r)/2;
if(mij<poz) update(2*nod+1,mij+1,r,x,poz);
else update(2*nod,l,mij,x,poz);
v[nod]=max(v[2*nod],v[2*nod+1]);
}
}
void querry(int nod,int l,int r,int a,int b){
int mij;
if(a<=l&&r<=b){
if(maxim<v[nod])
maxim=v[nod];
}
else{
mij=(l+r)/2;
if(mij<b) querry(2*nod+1,mij+1,r,a,b);
if(mij>=a) querry(2*nod,l,mij,a,b);
}
}
int main(){
FILE*fi,*fout;
int n,m,a,b,t,i,x,j;
fi=fopen("arbint.in" ,"r");
fout=fopen("arbint.out" ,"w");
fscanf(fi,"%d%d" ,&n,&m);
for(i=0;i<n;i++){
fscanf(fi,"%d" ,&x);
update(1,1,n,x,i+1);
}
for(i=0;i<m;i++){
fscanf(fi,"%d%d%d" ,&t,&a,&b);
if(t==0){
maxim=0;
querry(1,1,n,a,b);
fprintf(fout,"%d\n" ,maxim);
}
else
update(1,1,n,b,a);
}
fclose(fi) ;
fclose(fout);
return 0;
}