#include<cstdio>
int N;
int M;
int arb[500001];
int maxim;
int getmax(int a,int b){
if(a<b) return b;
return a;
}
void update(int nod,int st,int dr, int poz,int val){
if(st==dr){
arb[nod]=val;
}else{
int m=(st+dr)/2;
if(poz<=m){
update(2*nod,st,m,poz,val);
}else{
update(2*nod+1,m+1,dr,poz,val);
}
arb[nod]=getmax(arb[2*nod],arb[2*nod+1]);
}
}
void search(int nod,int left,int right,int start,int finish){
if(start<=left && right<=finish){
if(maxim<arb[nod]) maxim=arb[nod];
}else{
int div=(left+right)/2;
if(start<=div) search(2*nod,left,div,start,finish);
if(div< finish) search(2*nod+1,div+1,right,start,finish);
}
}
int main(){
int t,x,y;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&N,&M);
for(int i=1;i<=N;i++){
scanf("%d",&t);
update(1,1,N,i,t);
}
for(;M--;){
scanf("%d %d %d",&t,&x,&y);
if(t==0){
maxim=-1;
search(1,1,N,x,y);
printf("%d\n",maxim);
}else{
update(1,1,N,x,y);
}
}
return 0;
}