#include <stdio.h>
const int NMAX=100001;
inline int stanga(int i) {return 2*i;}
inline int dreapta(int i){return 2*i+1;}
int Arb[2*(NMAX+1)+1];
int n,m,x,max_aux;
void update(int,int,int,int,int);
void query(int,int,int,int,int);
int main(){
int i,a,b;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&x),update(i,x,1,1,n);
int j;
for (i=1;i<=m;i++){
scanf("%d%d%d",&x,&a,&b);
if (x==0){
max_aux=-1;
query(1,1,n,a,b);
printf("%d\n",max_aux);
}else update(a,b,1,1,n);
}
return 0;
}
void update(int poz,int val,int i,int st,int dr){
if (st==dr) {Arb[i]=val;return;}
int mid=(st+dr)/2;
if (poz<=mid) update(poz,val,stanga(i),st,mid);
else update(poz,val,dreapta(i),mid+1,dr);
if (Arb[stanga(i)]<Arb[dreapta(i)]) Arb[i]=Arb[dreapta(i)];
else Arb[i]=Arb[stanga(i)];
}
void query(int i,int st,int dr,int a,int b){
if (st>=a && dr<=b){
if (max_aux<Arb[i]) max_aux=Arb[i];
return;
}
int mid=(st+dr)/2;
if (a<=mid) query(stanga(i),st,mid,a,b);
if (mid<b) query(dreapta(i),mid+1,dr,a,b);
}