#include <fstream>
#include <algorithm>
#include <math.h>
#include <cstring>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int m, n, aint[400005], v[100005];
void build(int nod, int st, int dr){
if(st==dr){
aint[nod]=v[st];
}
else{
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 poz, int val){
if(st==dr){
aint[nod]=val;
}
else{
int mij=(st+dr)/2;
if(poz<=mij){
update(2*nod, st, mij, poz, val);
}
else{
update(2*nod+1, mij+1, dr, poz, val);
}
aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}
}
int query(int nod, int st, int dr, int ql, int qr){
if(ql<=st&&dr<=qr){
return aint[nod];
}
int mij=(st+dr)/2, val1=0, val2=0;
if(ql<=mij)val1=query(2*nod, st, mij, ql, qr);
if(mij+1<=qr)val2=query(2*nod+1, mij+1, dr, ql, qr);
return max(val1, val2);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i];
}
build(1, 1, n);
for(int i=1;i<=m;i++){
int t, a, b;
cin>>t>>a>>b;
if(t==0){
cout<<query(1, 1, n, a, b)<<'\n';
}
else{
update(1, 1, n, a, b);
}
}
}