#include<stdio.h>
#define Nmax 100024
int arb[3*Nmax];
int N,M;
int A[Nmax],poz[Nmax];
void init(int i, int li, int lf){
if(li==lf){
arb[i] = A[li];
poz[li] = i;
return;
}
int mij = (li+lf)>>1;
init(2*i,li,mij);
init(2*i+1,mij+1,lf);
arb[i] = arb[2*i];
if(arb[2*i+1]>arb[i])
arb[i] = arb[2*i+1];
}
int query(int i,int li, int lf, int a, int b){
if(lf<a || b<li) // intervalele nu se intersecteaza
return -1;
if(a<=li && lf<=b) //li,lf este inclus in a,b
return arb[i];
int mij = (li+lf)/2;
int maxst = query(2*i,li,mij,a,b);
int maxdr = query(2*i+1,mij+1,lf,a,b);
if(maxst > maxdr)
return maxst;
return maxdr;
}
void modif(int k){
int i = poz[k];
arb[i] = A[k];
i/=2;
while(i){
if(arb[2*i] > arb[2*i+1])
arb[i] = arb[2*i];
else
arb[i] = arb[2*i+1];
i/=2;
}
}
int main(){
FILE *fin = fopen("arbint.in","r"),
*fout = fopen("arbint.out","w");
fscanf(fin,"%d%d",&N,&M);
for(int i=1;i<=N;i++)
fscanf(fin,"%d",&A[i]);
init(1,1,N);
for(int i=1;i<=M;i++){
int v,a,b;
fscanf(fin,"%d%d%d",&v,&a,&b);
if(!v)
fprintf(fout,"%d\n",query(1,1,N,a,b));
else{
A[a] = b;
modif(a);
}
}
fclose(fin);
fclose(fout);
return 0;
}