#include<stdio.h>
int n,m,v[100000*2];
inline int max(int a,int b){return a>b?a:b;}
void update(int nod,int poz,int comp,int st,int dr){
if(st==dr){
v[nod]=comp;
return;
}else{
int mid=(st+dr)/2;
if(poz<=mid)
update(nod*2,poz,comp,st,mid);
else
update(nod*2+1,poz,comp,mid+1,dr);
v[nod]=max(v[nod*2],v[nod*2+1]);
}
}
void query(int nod,int pozst,int pozdr,int st,int dr,int &maxint){
if(pozst<=st && dr<=pozdr){
maxint=max(maxint,v[nod]);
return;
}
int mid=(st+dr)/2;
if(pozst<=mid)
query(nod*2,pozst,pozdr,st,mid,maxint);
if(pozdr>mid)
query(nod*2+1,pozst,pozdr,mid+1,dr,maxint);
}
int main(){
int i,x,y,maxint,code;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&x);
update(1,i,x,1,n);
}
while(m--){
scanf("%d %d %d\n",&code,&x,&y);
switch(code){
case 1:
update(1,x,y,1,n);
break;
case 0:
maxint=0;
query(1,x,y,1,n,maxint);
printf("%d\n",maxint);
break;
}
}
return 0;
}