#include <bits/stdc++.h>
using namespace std;
ifstream in("cmlsc.in");
ofstream out("cmlsc.out");
int v[100005];
int aint[500005];
void init(int nod, int l, int r) {
if (l > r)
return;
if (l == r) {
aint[nod] = v[l];
return;
}
int m = (l + r) / 2;
init(2 * nod, l, m);
init(2 * nod + 1, m + 1, r);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
void update(int nod, int l, int r, int a, int b) {
if (l > r)
return;
if (l == r) {
v[a] = b;
aint[nod] = b;
return;
}
int m = (l + r) / 2;
if (a <= m) {
update(2 * nod, l, m, a, b);
} else {
update(2 * nod + 1, m + 1, r, a, b);
}
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
int query(int nod, int l, int r, int a, int b) {
if (r < a || l > b)
return 0;
if (l >= a && r <= b)
return aint[nod];
int m = (l + r) / 2;
return max(query(2 * nod, l, m, a, b), query(2 * nod + 1, m + 1, r, a, b));
}
int main() {
int n, m;
in >> n >> m;
for (int i = 1; i <= n; i++)
in >> v[i];
init(1, 1, n);
for (int i = 0; i < m; i++) {
int op, a, b;
in >> op >> a >> b;
if (op == 0) {
out << query(1, 1, n, a, b) << '\n';
} else {
update(1, 1, n, a, b);
}
}
}