#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int nmax=100001;
int aint[nmax*3],n,m,v[nmax];
inline void build(int st,int dr,int nod){
if(st==dr){
aint[nod]=v[st];
}
else{
int mij=(st+dr)>>1;
build(mij+1,dr,2*nod+1);
build(st,mij,2*nod);
aint[nod]=max(aint[nod*2],aint[nod*2+1]);
}
}
inline void update(int st,int dr,int nod,int x,int y){
if(st==dr){
aint[nod]=y;
}
else{
int mij=(st+dr)>>1;
if(x<=mij){
update(st,mij,2*nod,x,y);
}
else{
update(mij+1,dr,2*nod+1,x,y);
}
}
}
inline int query(int st,int dr,int a,int b,int nod){
if(st==a&&dr==a){
return aint[nod];
}
int mij=(st+dr)>>1;
if(mij>=b)return query(st,mij,a,b,2*nod);
else if(a>mij)return query(mij+1,dr,a,b,2*nod+1);
else{
return max(query(st,mij,a,mij,2*nod),query(mij+1,dr,mij+1,b,2*nod+1));
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++){
fin>>v[i];
}
build(1,n,1);
for(int i=1;i<=m;i++){
int x,a,b;
fin>>x;
if(!x){
fin>>a>>b;
fout<<query(1,n,a,b,1)<<'\n';
}
else{
fin>>a>>b;
update(1,n,1,a,b);
cout<<1;
}
}
}