#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,v[1000001],segment_tree[1000001];
void build(int nod,int st,int dr){
if(st==dr)
segment_tree[nod]=v[st];
else{
int mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
segment_tree[nod]=max(segment_tree[nod*2],segment_tree[nod*2+1]);
}
}
void update(int nod,int st,int dr,int poz,int val){
if(st==dr)
segment_tree[nod]=val;
else{
int mij=(st+dr)/2;
if(poz<=mij)
update(nod*2,st,mij,poz,val);
else
update(nod*2+1,mij+1,dr,poz,val);
segment_tree[nod]=max(segment_tree[nod*2],segment_tree[nod*2+1]);
}
}
int query(int nod,int st,int dr,int query_st,int query_dr){
if(query_st<=st && query_dr>=dr)
return segment_tree[nod];
else{
int mij=(st+dr)/2;
if(query_dr<=mij)
return query(nod*2,st,mij,query_st,query_dr);
if(mij+1<=query_st)
return query(nod*2+1,mij+1,dr,query_st,query_dr);
return max(query(nod*2,st,mij,query_st,query_dr),query(nod*2+1,mij+1,dr,query_st,query_dr));
}
}
int main(){
int q;
fin>>n>>q;
for(int i=1;i<=n;i++)
fin>>v[i];
build(1,1,n);
while(q--){
int t; fin>>t;
if(t==1){
int x,y; fin>>x>>y;
update(1,1,n,x,y);
}
else{
int st,dr;
fin>>st>>dr;
fout<<query(1,1,n,st,dr)<<'\n';
}
}
return 0;
}