#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, q, i, a[400002], v[100002];
int poz, val, qx, qy, op;
static inline void setUp(int nod, int st, int dr) {
if(st == dr) a[nod] = v[st];
else {
int mij = (st + dr) / 2;
setUp(nod * 2, st, mij);
setUp(nod * 2 + 1, mij + 1, dr);
a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
}
}
static inline void update(int nod, int st, int dr) {
if(st == dr) a[nod] = val;
else {
int mij = (st + dr) / 2;
if(poz <= mij) update(nod * 2, st, mij);
else update(nod * 2 + 1, mij + 1, dr);
a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
}
}
static inline int query(int nod, int st, int dr) {
if(qx <= st && dr <= qy) return a[nod];
else {
int mij = (st + dr) / 2;
if(qy <= mij) return query(nod * 2, st, mij);
if(mij + 1 <= qx) return query(nod * 2 + 1, mij + 1, dr);
return max(query(nod * 2, st, mij),
query(nod * 2 + 1, mij + 1, dr));
}
}
int main() {
fin >> n >> q;
for(i = 1; i <= n; i++) fin >> v[i];
setUp(1, 1, n);
while(q--) {
fin >> op;
if(op == 0) {
fin >> qx >> qy;
fout << query(1, 1, n) << "\n";
}
else {
fin >> poz >> val;
update(1, 1, n);
}
}
return 0;
}