#include <stdio.h>
#define MAXN 100005
int N,M;
int arb[4*MAXN];
void construieste(int nod,int st,int dr,int A[]){
if(st==dr){
arb[nod]=A[st];
return;
}
int mij=(st + dr)/2;
construieste(2*nod,st,mij,A);
construieste(2*nod+1,mij+1,dr,A);
arb[nod]=arb[2*nod];
if(arb[2*nod+1]>arb[nod]){
arb[nod]=arb[2*nod+1];
}
}
void actualizeaza(int nod,int st,int dr,int poz,int valoare){
if(st==dr){
arb[nod]=valoare;
return;
}
int mij=(st+dr)/2;
if(poz<=mij){
actualizeaza(2*nod,st,mij,poz,valoare);
} else {
actualizeaza(2*nod+1,mij+1,dr,poz,valoare);
}
arb[nod]=arb[2*nod];
if(arb[2*nod+1]>arb[nod]){
arb[nod]=arb[2*nod+1];
}
}
int interogheaza(int nod,int st,int dr,int a,int b){
if(dr<a || st>b){
return 0;
}
if(a<=st && dr<=b){
return arb[nod];
}
int mij=(st+dr)/2;
int maxStanga=interogheaza(2*nod,st,mij,a,b);
int maxDreapta=interogheaza(2*nod+1,mij+1,dr,a,b);
if(maxStanga>maxDreapta){
return maxStanga;
} else {
return maxDreapta;
}
}
int A[MAXN];
int main(){
FILE *fin=fopen("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
fscanf(fin,"%d %d",&N,&M);
for(int i=1;i<=N;i++){
fscanf(fin,"%d",&A[i]);
}
construieste(1,1,N,A);
for(int m =0;m<M;m++){
int tip,a,b;
fscanf(fin,"%d %d %d",&tip,&a,&b);
if(tip==0){
int rezultat=interogheaza(1,1,N,a,b);
fprintf(fout,"%d\n",rezultat);
} else {
actualizeaza(1,1,N,a,b);
}
}
fclose(fin);
fclose(fout);
return 0;
}