#include <iostream>
using namespace std;
int a[400001],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;}
if(start<=(n+s)/2){
getMax(2*nod,s,(n+s)/2);
}
if((n+s)/2<_end){
getMax(2*nod+1,((n+s)/2)+1,n);
}
}
int max(int a,int b){return (a>b)?a:b;}
void update(int nod,int s,int n){
if(s==n){a[nod]=val;return;}
int mij=(n+s)/2;
if(pos<=mij){
update(2*nod,s,mij);
}else{
update(2*nod+1,mij+1,n);
}
//cout<<a[2*nod]<<" "<<a[2*nod+1]<<endl;
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=1;i<4*n+4;i++)cout<<"Nod "<<i<<" "<<a[i]<<endl;
for(int i=0;i<m;i++){
scanf("%d %d %d",&d,&b,&c);
if(d==0){
start=b;_end=c;
//cout<<"Interval "<<b<<" "<<c<<endl;
getMax(1,1,n);
printf("%d\n",_max);
_max=-2e9;
}
else{
pos=b;val=c;
update(1,1,n);
//for(int i=1;i<4*n;i++)cout<<"Nod "<<i<<" "<<a[i]<<endl;
}
}
}