#include<stdio.h>
#define Nmax 100005
int A[Nmax];
int arb[3*Nmax];
int 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)/2;
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(b<li || lf<a)
return -1;
if(a<=li && lf<=b)
return arb[i];
int mij = (li+lf) >> 1;
int max1 = query(2*i,li,mij,a,b),
max2 = query(2*i+1,mij+1,lf,a,b);
if(max1 > max2)
return max1;
return max2;
}
int main(){
FILE *fin = fopen("arbint.in","r"),
*fout = fopen("arbint.out","w");
int N,M;
fscanf(fin,"%d%d",&N,&M);
for(int i=1;i<=N;i++) fscanf(fin,"%d",&A[i]);
init(1,1,N);
for(int t=0;t<M;t++){
int x,a,b;
fscanf(fin,"%d%d%d",&x,&a,&b);
if(x){
arb[poz[a]] = b;
int i = poz[a] / 2;
while(i){
arb[i] = arb[2*i];
if(arb[2*i+1] > arb[i])
arb[i] = arb[2*i+1];
i>>=1;
}
}
else
fprintf(fout,"%d\n",query(1,1,N,a,b));
}
fclose(fin);
fclose(fout);
return 0;
}