#include<cstdio>
#define max(x,y) ((x)>(y))?(x):(y)
int a[400000];
void update(int nod,int left, int right, int &val, int &pos){
if(left==right){
a[nod]=val;
return;
}
int mij=(left+right)/2;
if(pos<=mij)
update(nod*2,left,mij,val,pos);
else
update(nod*2+1,mij+1,right,val,pos);
a[nod]=max(a[nod*2],a[nod*2+1]);
}
int query(int nod,int left, int right,int &l, int &r){
if(l<=left && r>=right){
return a[nod];
}
int mij=(left+right)/2;
return max( l<=mij?query(nod*2,left,mij,l,r):0 , r>mij?query(nod*2+1,mij+1,right,l,r):0 );
}
int main(){
int n,m,x,i;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i){
scanf("%d",&x);
update(1,1,n,x,i);
}
int t,y;
for(;m>0;--m){
scanf("%d%d%d",&t,&x,&y);
if(t) update(1,1,n,y,x);
else printf("%d\n",query(1,1,n,x,y));
}
return 0;
}