#include<stdio.h>
int arbint[100001],max;
inline int maxof2(int a,int b){
if(a<b)
return b;
return a;
}
void up(int nod, int left, int right,int v,int p){
if(left==right)
arbint[nod]=v;
else{
int mij=(left+right)/2;
if(p<=mij)
up(2*nod,left,mij,v,p);
else
up(2*nod+1,mij+1,right,v,p);
arbint[nod]=maxof2(arbint[2*nod+1],arbint[2*nod]);
}
}
void getans(int nod, int left, int right,int st,int dr){
if(right<=dr&&st<=left){
if(max<arbint[nod])
max=arbint[nod];
}
else{
int mij=(left+right)/2;
if(st<=mij)
getans(2*nod,left,mij,st,dr);
if(mij<dr)
getans(2*nod+1,mij+1,right,st,dr);
}
}
int main(){
FILE *fin,*fout;
fin=fopen("arbint.in","r");
fout=fopen("arbint.out","w");
int n,m;
fscanf(fin,"%d%d",&n,&m);
int i;
for(i=1;i<=n;i++){
int x;
fscanf(fin,"%d",&x);
up(1,1,n,x,i);
}
for(i=1;i<=m;i++){
int x,a,b;
fscanf(fin,"%d%d%d",&x,&a,&b);
if(x==0){
max=-1;
getans(1,1,n,a,b);
fprintf(fout,"%d\n",max);
}
else
up(1,1,n,b,a);
}
return 0;
}