#include<stdio.h>
int n,i,v[100010],x,y,m,k,a,tip;
int maxim(int x, int y){
return x>y?x:y;
}
void update(int nod,int s,int d){
int nodst,noddr,mij;
if(s==d){
v[nod]=k;
return;
}
mij=(s+d)/2;
nodst=2*nod;
noddr=nodst+1;
if(a<=mij)
update(nodst,s,mij);
if(a>mij)
update(noddr,mij+1,d);
v[nod]=maxim(v[noddr],v[nodst]);
}
int query(int nod,int s,int d){
int qst=0;
int qdr=0;
if(x<=s && d<=y)
return v[nod];
int mij=(s+d)/2;
int nodst=2*nod;
int noddr=nodst+1;
if(x<=mij)
qst=query(nodst,s,mij);
if(x>mij)
qdr=query(noddr,mij+1,d);
return maxim(qst,qdr);
}
int main(){
FILE*f=fopen("arbint.in","r");
FILE*g=fopen("arbint.out","w");
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=n;i++){
fscanf(f,"%d",&k);
a=i;
update(1,1,n);
}
for(i=1;i<=m;i++){
fscanf(f,"%d %d %d",&tip,&x,&y);
if(tip==0)
fprintf(g,"%d\n",query(1,1,n));
else{
a=x;
k=y;
update(1,1,n);
}
}
fclose(f);
fclose(g);
return 0;
}