#include <iostream>
int a[400000],n,pos,val,start,_end,_max=-2e9;
void getMax(int nod,int s,int n){
if(start<=s&&n<=_end){if(_max<a[nod])_max=a[nod];return;}
int mij=(n+s)>>1;
if(start<=mij){
getMax(2*nod,s,mij);
}
if((n+s)/2<_end){
getMax(2*nod+1,mij+1,n);
}
}
int max(int a,int b){return (a>b)?a:b;}
void update(int nod,int s,int ns){
if(s==ns){a[nod]=val;return;}
int mij=(ns+s)>>1;
if(pos<=mij){
update(2*nod,s,mij);
}else{
update(2*nod+1,mij+1,ns);
}
a[nod]=max(a[2*nod],a[2*nod+1]);
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int m,d,b,c;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&d);pos=i,val=d;
update(1,1,n);
}
for(int i=0;i<m;i++){
scanf("%d %d %d",&d,&b,&c);
if(d==0){
start=b;_end=c;
getMax(1,1,n);
printf("%d\n",_max);
_max=-2e9;
}
else{
pos=b;val=c;
update(1,1,n);
}
}
}