#include <bits/stdc++.h>
const int MAX_N = 100005;
int n, m;
int tree[MAX_N * 4];
inline void update(int u, int lo, int ri, int pos, int value) {
int mid = (lo + ri) / 2;
if (lo > ri) {
return;
}
if (lo == ri) {
tree[u] = value;
return;
}
if (mid >= pos) {
update(2 * u, lo, mid, pos, value);
} else {
update(2 * u + 1, mid + 1, ri, pos, value);
}
tree[u] = std::max(tree[2 * u], tree[2 * u + 1]);
}
inline int query(int u, int lo, int ri, int st, int en) {
int mid = (lo + ri) / 2;
if (lo > ri) {
return INT_MIN;
}
if (lo >= st && ri <= en) {
return tree[u];
}
if (mid >= en) {
return query(2 * u, lo, mid, st, en);
} else if (mid < st) {
return query(2 * u + 1, mid + 1, ri, st, en);
} else {
return std::max(query(2 * u, lo, mid, st, en), query(2 * u + 1, mid + 1, ri, st, en));
}
}
int main() {
int value, op_type, pos, lo, ri;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &value);
update(1, 1, n, i, value);
}
while (m --) {
scanf("%d", &op_type);
if (op_type == 0) {
scanf("%d %d", &lo, &ri);
printf("%d\n", query(1, 1, n, lo, ri));
} else {
scanf("%d %d", &pos, &value);
update(1, 1, n, pos, value);
}
}
#ifdef LOCAL_DEFINE
std::cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
return 0;
}