#include <cstdio>
struct interval{
int st,dr;
int valoare;
};
inline int Maxim(int a , int b){return a<b?b:a;}
int Arbore[1<<18], n, pos, valoare,a,b ;
void Update(int nod, int st, int dr){
if(st == dr)
Arbore[nod] = valoare;
else{
int mijloc = (st+dr)/2;
if(pos<=mijloc)
Update(2*nod, st, mijloc);
else
Update(2*nod +1, mijloc+1, dr );
Arbore[nod] = Maxim(Arbore[2*nod], Arbore[2*nod+1]);
}
}
int Query(int nod, int st, int dr){
if( a<=st && dr<=b)
return Arbore[nod];
else{
int mijloc = (st+dr)/2, m1,m2;
m1=m2=-1;
if(a<=mijloc)
m1 = Query(2*nod, st,mijloc);
if(b>mijloc)
m2 = Query(2*nod+1,mijloc+1,dr);
return Maxim(m1,m2);
}
}
int main(){
FILE *f = fopen("arbint1.in","r");
int m;
fscanf(f,"%d%d", &n,&m);
int x;
for(int i=1;i<=n;i++){
fscanf(f,"%d", &x);
pos = i, valoare = x;
Update(1,1,n);
}
FILE *g = fopen("arbint.out","w");
for( ; m ; --m){
int op;
fscanf(f,"%d%d%d", &op,&a,&b);
if(op == 0){
fprintf(g,"%d\n", Query(1,1,n));
}
else{
pos=a,valoare=b;
Update(1,1,n);
}
}
// for(int i=1;i<=2*n;i++)
// printf("%d ",Arbore[i]);
return 0;
}