#include <iostream>
using namespace std;
const int nmax = 1e5 + 1;
static int n, m;
static int a[nmax];
static int aint[nmax * 2];
// Ok
void makeAint(int b, int e, int i) {
if (b == e) {
aint[i] = a[b];
return;
}
int m = (b + e) / 2;
makeAint(b, m, 2 * i);
makeAint(m + 1, e, 2 * i + 1);
aint[i] = max(aint[i * 2], aint[i * 2 + 1]);
}
void update(int b, int e, int i, int j, int v) {
if (b == e) {
aint[i] = v;
return;
}
int m = (b + e) / 2;
if (j <= m) update(b, m, 2 * i, j, v);
if (j > m) update(m + 1, e, 2 * i + 1, j, v);
aint[i] = max(aint[i * 2], aint[i * 2 + 1]);
}
int query(int b, int e, int l, int r, int i) {
if (l <= b && e <= r) return aint[i];
int m = (b + e) / 2;
if (r <= m) return query(b, m, l, r, i * 2);
if (m < l) return query(m + 1, e, l, r, i * 2 + 1);
return max(query(b, m, l, r, i * 2), query(m + 1, e, l, r, i * 2 + 1));
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
makeAint(1, n, 1);
int c, a, b;
for (int i = 0; i < m; i++) {
cin >> c >> a >> b;
if (c == 0) cout << query(1, n, a, b, 1) << '\n';
if (c == 1) update(1, n, 1, a, b);
}
}