#include <fstream>
using namespace std;
int constexpr nMax=100010;
int v[nMax], aint[nMax];
int n, m;
int queryInt(int nod, int st, int dr, int qSt, int qDr){
if (st>=qSt&&dr<=qDr){
return aint[nod];
}
int mid=(st+dr)/2;
if (qDr<=mid){
return queryInt(nod*2, st, mid, qSt, qDr);
}
if (mid+1<=qSt){
return queryInt(nod*2+1, mid+1, dr, qSt, qDr);
}
return max(queryInt(nod*2, st, mid, qSt, qDr), queryInt(nod*2+1, mid+1, dr, qSt, qDr));
}
void updateInt(int nod, int st, int dr, int poz, int val){
if (st==dr){
aint[nod]=val;
return;
}
int mid=(st+dr)/2;
if (poz<=mid){
updateInt(nod*2, st, mid, poz, val);
}
else{
updateInt(nod*2+1, mid+1, dr, poz, val);
}
aint[nod]=max(aint[nod*2], aint[nod*2+1]);
}
void buildInt(int nod, int st, int dr){
if (st==dr){
aint[nod]=v[st];
return;
}
int mid=(st+dr)/2;
buildInt(nod*2, st, mid);
buildInt(nod*2+1, mid+1, dr);
aint[nod]=max(aint[nod*2], aint[nod*2+1]);
}
inline int query(int qSt, int qDr){return queryInt(1, 1, n, qSt, qDr);}
inline void update(int poz, int val){updateInt(1, 1, n, poz, val);}
inline void build(){buildInt(1, 1, n);}
int main () {
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
fin>>n>>m;
for (int i=1;i<=n;i++){
fin>>v[i];
}
build();
for (int i=1;i<=m;i++){
int c;
fin>>c;
if (!c){
int st, dr;
fin>>st>>dr;
fout<<query(st, dr)<<"\n";
}
else{
int poz, val;
fin>>poz>>val;
update(poz, val);
}
}
return 0;
}