#include <stdio.h>
int N,M,segtree[400300],pos,ql,qr,val,MAX;
int maxim(int a, int b){
if (a>b) return a;
return b;
}
void update(int nod, int l, int r){
if (l==r){
segtree[nod]=val;
return;
}
int mid=(l+r)/2;
if (pos<=mid) update(2*nod,l,mid);
else update(2*nod+1,mid+1,r);
segtree[nod]= maxim(segtree[nod*2],segtree[nod*2+1]);
}
void query(int nod, int l, int r){
if (ql<=l && r<=qr){
if (MAX<segtree[nod]) MAX=segtree[nod];
return;
}
int mid=(l+r)/2;
if (ql<=mid) query(2*nod,l,mid);
if (mid<qr) query(2*nod+1,mid+1,r);
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d\n",&N,&M);
int i,A,B,type;
for (i=1; i<=N; i++){
scanf("%d",&val);
pos=i;
update(1,1,N);
}
for (i=1; i<=M; i++){
scanf("%d %d %d\n",&type, &A, &B);
if (type==0){
MAX=0;
ql=A, qr=B;
query(1,1,N);
printf("%d\n",MAX);
}
else{
pos=A, val=B;
update(1,1,N);
}
}
return 0;
}