#include<fstream>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
const int MAX_NOD = 4*100005+3;
int i,n,m,oper,a,b,sol,x,arb[MAX_NOD];
void creare_arbore(int nod, int st, int dr){
if(st==dr){
fi>>x;
arb[nod]=x;
}else{
int mijl=(st+dr)/2;
creare_arbore(2*nod,st,mijl);
creare_arbore(2*nod+1,mijl+1,dr);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
}
void update(int nod, int st, int dr, int poz, int valoare){
if(st==dr) arb[nod]=valoare;
else{
int mijl=(st+dr)/2;
if(poz<=mijl) update(2*nod,st,mijl,poz,valoare);
else update(2*nod+1,mijl+1,dr,poz,valoare);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
}
void query(int nod, int st, int dr, int a, int b){
if(a<=st && dr<=b){
sol=max(sol,arb[nod]);
}else{
int mijl=(st+dr)/2;
if(a<=mijl) query(2*nod,st,mijl,a,b);
if(mijl+1<=b) query(2*nod+1,mijl+1,dr,a,b);
}
}
int main(){
fi>>n>>m;
creare_arbore(1,1,n);
for(i=1;i<=m;i++){
fi>>oper>>a>>b;
if(oper==0){
sol=0;
query(1,1,n,a,b);
fo<<sol<<"\n";
} else update(1,1,n,a,b);
}
fi.close();
fo.close();
return 0;
}