#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int H[400001], n, m, sol, t, x, y;
void update(int n, int l, int r, int p, int v) {
if (l >= r) {
H[n] = v;
return;
}
int m = (l + r) / 2;
if (p <= m)
update(2 * n, l, m, p, v);
else
update(2 * n + 1, m + 1, r, p, v);
H[n] = max(H[2 * n], H[2 * n + 1]);
}
int query(int n, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) {
return H[n];
}
int m = (l + r) / 2;
int result = 0;
if (ql <= m)
result = max(result, query(2 * n, l, m, ql, qr));
if (qr > m)
result = max(result, query(2 * n + 1, m + 1, r, ql, qr));
return result;
}
int main() {
f >> n >> m;
for (int i = 1; i <= n; ++i) {
f >> x;
update(1, 1, n, i, x);
}
for (int i = 1; i <= m; ++i) {
f >> t >> x >> y;
if (t)
update(1, 1, n, x, y);
else {
g << query(1, 1, n, x, y) << endl;
}
}
return 0;
}