#include<stdio.h>
#define Max 500000
int Arb[Max],n,m,x,a,b,Pos,Val,inc,sf,maxim,i;
void citire();
void update(int,int,int);
void query(int,int,int);
inline int max(int a,int b){
if (a>b) return a;
else return b;
}
int main(){
citire();
return 0;
}
void citire(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
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,&a,&b);
if (x==0)
{
maxim=-1;
inc=a;sf=b;
query(1,1,n);
printf("%d\n",maxim);
}
else
{
Pos=a;Val=b;
update(1,1,n);
}
}
}
void update(int nod, int left, int right){
if (left==right)
{
Arb[nod]=Val;
return;
}
int mij=(left+right)/2;
if (Pos<=mij) update(2*nod,left,mij);
else update(2*nod+1,mij+1,right);
Arb[nod]=max(Arb[2*nod],Arb[2*nod+1]);
}
void query(int nod,int left,int right) {
if (inc<=left && right<=sf)
{
if (maxim<Arb[nod]) maxim=Arb[nod];
return;
}
int mij=(left+right)/2;
if (inc<=mij) query(2*nod,left,mij);
if (mij<sf) query(2*nod+1,mij+1,right);
}