#include <stdio.h>
#define logmax 18
int aint[1<<logmax];
int maxim(int a,int b){
if(a>b)
return a;
return b;
}
int query(int a,int b,int nod,int st,int dr){
int m1=0, m2=0;
if(st>=a&&dr<=b)
return aint[nod];
else{
if(a<=(st+dr)/2)
m1 = query(a,b,nod*2,st,(st+dr)/2);
if(b>(st+dr)/2)
m2 = query(a,b,nod*2+1,(st+dr)/2+1,dr);
return maxim(m1,m2);
}
}
void update(int poz,int val,int nod,int st,int dr){
if(st==dr)
aint[nod]=val;
else{
if(poz<=(st+dr)/2)
update(poz,val,nod*2,st,(st+dr)/2);
else
update(poz,val,nod*2+1,(st+dr)/2+1,dr);
aint[nod]=maxim(aint[2*nod],aint[2*nod+1]);
}
}
int main(){
FILE *fin,*fout;
fin=fopen("arbint.in","r");
fout=fopen("arbint.out","w");
int i,a,b,n,m,cer;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++){
fscanf(fin,"%d",&b);
update(i,b,1,1,n);
}
for(i=1;i<=m;i++){
fscanf(fin,"%d%d%d",&cer,&a,&b);
if(cer==0)
fprintf(fout,"%d\n",query(a,b,1,1,n));
else{
update(a,b,1,1,n);
}
}
fclose(fin);
fclose(fout);
return 0;
}