#include <stdio.h>
int n,i,v[4*100010],x,y,k,a,tip,max,m;
int maxim(int x, int y){
return x>y?x:y;
}
void update(int nod,int s,int d){
if(s==d){
v[nod]=k;
return;
}
int m=(s+d)/2;
int nodst=nod*2;
int noddr=nodst+1;
if(a<=m)
update(nodst,s,m);
else
update(noddr,m+1,d);
v[nod]=maxim(v[nodst],v[noddr]);
}
void query(int nod,int s,int d){
if(x<=s && d<=y){
if(v[nod]>max)
max=v[nod];
return;
}
int m=(s+d)/2;
int nodst=nod*2;
int noddr=nodst+1;
if(x<=m)
query(nodst,s,m);
if(m<y)
query(noddr,m+1,d);
}
int main(){
FILE*f=fopen("arbint.in","r");
FILE*g=fopen("arbint.out","w");
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&k);
a=i;
update(1,1,n);
}
for(i=1;i<=m;i++){
fscanf(f,"%d %d %d",&tip,&x,&y);
if(!tip){
max=-1;
query(1,1,n);
fprintf(g,"%d\n",max);
}
else{
a=x; k=y;
update(1,1,n);
}
}
fclose(f);
fclose(g);
return 0;
}