#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;
int a[100001];
void update(int n, int left, int right, int p, int v) {
if (left >= right) {
H[n] = v;
return;
}
int m = (left + right) / 2;
if (p <= m)
update(2 * n, left, m, p, v);
else
update(2 * n + 1, m + 1, right, p, v);
H[n] = max(H[2 * n], H[2 * n + 1]);
}
int query(int n, int left, int right, int ql, int qr) {
if (ql <= left && right <= qr) {
return H[n];
}
int m = (left + right) / 2;
int result = 0;
if (ql <= m)
result = max(result, query(2 * n, left, m, ql, qr));
if (qr > m)
result = max(result, query(2 * n + 1, m + 1, right, ql, qr));
return result;
}
void build(int n, int l, int r) {
if (l >= r) {
H[n] = a[l];
return;
}
int m = (l + r) / 2;
build(2 * n, l, m);
build(2 * n + 1, m + 1, r);
H[n] = max(H[2 * n], H[2 * n + 1]);
}
int main() {
f >> n >> m;
for (int i = 1; i <= n; ++i) {
f >> a[i];
/// update(1, 1, n, i, x);
}
build(1, 1, n);
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;
}