#include<stdio.h>
int max,t,p,u,val,poz,n,m,i,a[1000111];
int Max(int a,int b){
if(a>b)
return a;
return b;
}
void update(int nod,int st,int dr){
int mij;
if(st==dr){
a[nod]=val;
return;
}
mij=(st+dr)/2;
if(poz<=mij)
update(nod<<1, st, mij);
else
update( (nod<<1)+1, mij+1, dr );
a[nod]=Max(a[nod<<1],a[(nod<<1)+1]);
}
void query(int nod,int st,int dr){
int mij;
if(p<=st&&dr<=u){
max=Max(max,a[nod]);
return;
}
mij=(st+dr)/2;
if(p <= mij)
query(nod<<1 , st, mij);
if(u > mij)
query( (nod<<1) +1, mij+1, dr);
}
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",&val);
poz=i;
update(1,1,n);
}
for(i=1;i<=m;i++){
fscanf(f,"%d",&t);
if(!t){
fscanf(f,"%d %d",&p,&u);
max=-1;
query(1,1,n);
fprintf(g,"%d\n",max);
}
if(t){
fscanf(f,"%d %d",&poz,&val);
update(1,1,n);
}
}
fclose(f);
fclose(g);
return 0;
}