#include<fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int i,n,aa,b,t,x,v[100010],a[400010];
void build(int nod,int l,int r){
if(l==r){
a[nod]=v[l];
}
else{
int mij=(l+r)/2;
build(nod*2,l,mij);
build(nod*2+1,mij+1,r);
a[nod]=max(a[nod*2], a[nod*2+1]);
}
}
void update(int nod,int l,int r,int poz,int ap){
if(l==r){
a[nod]=ap;
}
else{
int mij=(l+r)/2;
if(poz<=mij)
update(nod*2,l,mij,poz,ap);
else
update(nod*2+1,mij+1,r,poz,ap);
a[nod]=max(a[nod*2],a[nod*2+1]);
}
}
int query(int nod,int l,int r,int ql,int qr){
if(ql<=l && r<=qr){
return a[nod];
}
else{
int mij=(l+r)/2;
if(qr<=mij)
return query(nod*2,l,mij,ql,qr);
if(mij+1<=ql)
return query(nod*2+1,mij+1,r,ql,qr);
return max(query(nod*2,l,mij,ql,qr),
query(nod*2+1,mij+1,r,ql,qr));
}
}
int main(){
fin>>n>>t;
for(i=1;i<=n;i++)
fin>>v[i];
build(1,1,n);
for(i=1;i<=t;i++){
fin>>x>>aa>>b;
if(x==0)
fout<<query(1,1,n,aa,b)<<"\n";
else
update(1,1,n,aa,b);
}
return 0;
}