#include<stdio.h>
#define fs (nod<<1)
#define fd (fs +1)
#define mij ((st+dr)>>1)
#define MAX 1<<20
long V[MAX],n,m,val,poz,s;
void update(int nod, int st, int dr){
if(st>=dr)V[nod]=val;
else{
if(poz<=mij) update(fs,st,mij);
else update(fd,mij+1,dr);
V[nod]=V[fs]>V[fd]?V[fs]:V[fd];
}
}
void query(int nod,int st,int dr, int a,int b){
if(a<=st && dr<=b) s=s>V[nod]?s:V[nod];
else{
if(mij>=a) query(fs,st,mij,a,b);
if(mij<b) query(fd,mij+1,dr,a,b);
}
}
int main(){
int o;
freopen("arbin.in","rt",stdin);
freopen("arbin.out","wt",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&val);
poz=i;
update(1,1,n);
}
for(;m--;){
scanf("%d%d%d",&o,&poz,&val);
if(o) update(1,1,n);
else {
s=0;
query(1,1,n,poz,val);
printf("%d\n",s);
}
}
return 0;
}