#include <cstdio>
int n,m,arbMax[400006],val,poz,valMax,start,finish;
void citire(){
scanf("%ld %ld",&n,&m);
}
int maxim(int a,int b){
if(a>b)
return a;
else return b;
}
void update(int nod,int st,int dr){
if(st==dr){
arbMax[nod]=val;
return;
}
int minim=(st+dr)/2;
if(poz<=minim)
update(2*nod,st,minim);
else update(2*nod+1,minim+1,dr);
arbMax[nod]=maxim(arbMax[2*nod],arbMax[2*nod+1]);
}
void query(int nod,int st,int dr){
if(start<=st && dr<=finish){
if(valMax<arbMax[nod])
valMax=arbMax[nod];
return;
}
int minim=(st+dr)/2;
if(minim>=start)
query(2*nod,st,minim);
if(minim+1<=finish)
query(2*nod+1,minim+1,dr);
}
void rezolvare2(){
int i,x,a,b;
for(i=1;i<=n;i++){
scanf("%ld",&x);
val=x;
poz=i;
update(1,1,n);
}
for(i=1;i<=m;i++){
scanf("%ld %ld %ld",&x,&a,&b);
if(x==1){
val=b;
poz=a;
update(1,1,n);
}
else {
start=a;
finish=b;
valMax=-1;
query(1,1,n);
printf("%ld\n",valMax);
}
}
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire();
rezolvare2();
return 0;
}