#include<iostream>
#include<cstdint>
using namespace std;
#define NMAX 100001
#define INF int32_t(1e9+7)
int32_t n,q,aint[4*NMAX];
void init(int32_t nod,int32_t st,int32_t dr){
if(st==dr){
cin>>aint[nod];
return;
}
int32_t mij=(st+dr)/2;
init(2*nod,st,mij);
init(2*nod+1,mij+1,dr);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
void update(int32_t nod,int32_t st,int32_t dr,int32_t x,int32_t y){
if(x<st||dr<x)return;
if(st==dr&&dr==x){
aint[nod]=y;
return;
}
int32_t mij=(st+dr)/2;
if(x<=mij)update(2*nod,st,mij,x,y);
else update(2*nod+1,mij+1,dr,x,y);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
int query(int nod,int st,int dr,int x,int y){
if(dr<x||y<st)return 0;
if(x<=st&&dr<=y){
return aint[nod];
}
int32_t mij=(st+dr)/2;
return max(query(2*nod,st,mij,x,y),query(2*nod+1,mij+1,dr,x,y));
}
int32_t main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
cin>>n>>q;
init(1,1,n);
for(;q;--q){
int32_t op,x,y;
cin>>op>>x>>y;
if(op){
update(1,1,n,x,y);
}else{
cout<<query(1,1,n,x,y)<<"\n";
}
}
return EXIT_SUCCESS;
}