#include <bits/stdc++.h>
using namespace std;
#define debug(x) cerr << #x << " = " << x << "\n";
ifstream in("arbint.in");
ofstream out("arbint.out");
const int inf = (int)1e9 + 7;
const int max_n = (int)1e5 + 5;
int n, m;
int seg[max_n * 4];
int v[max_n];
void build(int u, int l, int r) {
if (l == r) {
seg[u] = v[l];
return;
}
int m = (l + r) / 2;
build(2 * u, l, m);
build(2 * u + 1, m + 1, r);
seg[u] = max(seg[2 * u], seg[2 * u + 1]);
}
void update(int u, int l, int r, int pos, int val) {
if (l == r && l == pos) {
seg[u] = val;
return;
}
int m = (l + r) / 2;
if (pos <= m) {
update(2 * u, l, m, pos, val);
} else {
update(2 * u + 1, m + 1, r, pos, val);
}
seg[u] = max(seg[2 * u], seg[2 * u + 1]);
}
int query(int u, int l, int r, int ql, int qr) {
if (l > qr || r < ql) {
return -inf;
}
if (l >= ql && r <= qr) {
return seg[u];
}
int m = (l + r) / 2;
return max(query(2 * u, l, m, ql, qr),
query(2 * u + 1, m + 1, r, ql, qr));
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; i++) {
in >> v[i];
}
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int op, x, y;
in >> op >> x >> y;
if (op == 0) {
out << query(1, 1, n, x, y) << "\n";
} else {
update(1, 1, n, x, y);
}
}
return 0;
}