#include<cstdio>
#define nmax 100005
int arb[4*nmax+50],maxim,pos,start,finish,val;
void update(int nod,int left,int right){
if( left==right){
arb[nod]=val;
return ;
}
int div=(left+right)/2;
if(pos<=div)update(2*nod,left,div);
else update(2*nod+1,div+1,right);
if(arb[2*nod]>arb[2*nod+1])arb[nod]=arb[2*nod];
else arb[nod]=arb[2*nod+1];
}
void query(int nod,int left,int right){
if( start<=left && right<=finish ){
if(maxim<arb[nod])maxim=arb[nod];
return ;
}
int div=(left+right)/2;
if(start<=div)query(2*nod,left,div);
if(div<finish)query(2*nod+1,div+1,right);
}
int main(void){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,m,x,i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i){
scanf("%d",&x);
pos = i; val = x;
update(1,1,n);
}
for(i=1;i<=m;++i){
scanf("%d%d%d",&x,&start,&finish);
if(x){
pos = start; val = finish;
update(1,1,n);
}
else{
maxim=-1;
query(1,1,n);
printf("%d\n",maxim);
}
}
return 0;
}