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