#include <fstream>
using namespace std;
const int maxN=1e5+1;
const int INF=1<<30;
int n,q;
int v[maxN];
int aint[4*maxN];
void build(int nod,int st,int dr){
if(st==dr){
aint[nod]=v[st];
return;
}
int mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
void update(int nod,int st,int dr,int pos,int val){
if(st==dr){
aint[nod]=val;
return;
}
int mij=(st+dr)/2;
if(pos<=mij){
update(2*nod,st,mij,pos,val);
} else {
update(2 * nod + 1, mij + 1, dr, pos, val);
}
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
int query(int nod,int st,int dr,int lef,int rig){
if(lef<=st && dr<=rig){
return aint[nod];
}
int res=0;
int mij=(st+dr)/2;
if(lef<=mij){
res=max(res,query(2*nod,st,mij,lef,rig));
}
if(mij<rig){
res=max(res,query(2*nod+1,mij+1,dr,lef,rig));
}
return res;
}
int main(){
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>v[i];
}
build(1,1,n);
while(q--){
int op;
cin>>op;
if(op==0){
int lef,rig;
cin>>lef>>rig;
cout<<query(1,1,n,lef,rig)<<'\n';
} else {
int pos,val;
cin>>pos>>val;
update(1,1,n,pos,val);
}
}
return 0;
}