#include<cstdio>
#define max(x,y) (x>y)?x:y
int a[400000];
int maxim,val,pos,l,r;
void update(int nod,int left, int right){
if(left==right){
a[nod]=val;
return;
}
int mij=(left+right)>>1;
if(pos<=mij)
update((nod<<1),left,mij);
else
update((nod<<1)+1,mij+1,right);
a[nod]=max(a[nod<<1],a[(nod<<1)+1]);
}
void query(int nod,int left, int right){
if(l<=left && r>=right){
if(maxim<a[nod]) maxim=a[nod];
return;
}
int mij=(left+right)>>1;
if(l<=mij) query((nod<<1),left,mij);
if(r>mij) query((nod<<1)+1,mij+1,right);
}
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",&val); pos=i;
update(1,1,n);
}
int t,y;
for(;m>0;--m){
scanf("%d%d%d",&t,&x,&y);
if(t) { val=y; pos=x; update(1,1,n);}
else {
maxim=0;
l=x; r=y;
query(1,1,n);
printf("%d\n",maxim);
}
}
return 0;
}