#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arb[(1<<18)],n,nrint;
int maxim(int a, int b){
return a>b?a:b;
}
void actualizare(int nod, int st, int dr, int poz, int val){
if(poz<=st && dr<=poz){
arb[nod]=val;
return;
}
int mij=(st+dr)>>1;
if(poz<=mij)
actualizare(nod<<1,st,mij,poz,val);
if(mij<poz)
actualizare((nod<<1)+1,mij+1,dr,poz,val);
arb[nod]=maxim(arb[2*nod],arb[2*nod+1]);
}
int interogare(int nod, int st, int dr, int x, int y){
if(x<=st && dr<=y)
return arb[nod];
int m=(st+dr)>>1;
int rez=0;
if(x<=m)
rez=max(rez,interogare((nod<<1),st,m,x,y));
if(m+1<=y)
rez=max(rez,interogare((nod<<1)+1,m+1,dr,x,y));
return rez;
}
int main()
{
in>>n>>nrint;
int i,val,a,b,t;
for(i=1;i<=n;i++){
in>>val;
actualizare(1,1,n,i,val);
}
for(i=1;i<=nrint;i++){
in>>t>>a>>b;
if(t!=0)
actualizare(1,1,n,a,b);
else{
out<<interogare(1,1,n,a,b)<<"\n";
}
}
in.close();
out.close();
return 0;
}