#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
void update(std::vector<int>& A, int idx, int l, int r, int pos, int val) {
if (l == r) {
A[idx] = val;
return;
}
int m = (l + r) / 2;
if (pos <= m) {
update(A, idx * 2, l, m, pos, val);
} else {
update(A, idx * 2 + 1, m + 1, r, pos, val);
}
A[idx] = std::max(A[idx * 2], A[idx * 2 + 1]);
}
int getmax(const std::vector<int>& A, int idx, int l, int r, int a, int b) {
if (l > r || r < a || b < l)
return -1;
if (a <= l && r <= b) // [l..r] included in [a..b]
return A[idx];
int m = (l + r) / 2;
int maxl = getmax(A, idx * 2, l, m, a, b);
int maxr = getmax(A, idx * 2 + 1, m + 1, r, a, b);
return std::max(maxl, maxr);
}
int main() {
int m, n, x;
std::ifstream in("arbint.in");
std::ofstream out("arbint.out");
in >> m >> n;
std::vector<int> A(4 * n);
for (int i = 1; i <= n; i++) {
in >> x;
update(A, 1, 1, n, i, x);
}
for (int i = 0; i < m; i++) {
int op, a, b;
in >> op >> a >> b;
if (op == 0) {
out << getmax(A, 1, 1, n, a, b) << "\n";
} else {
update(A, 1, 1, n, a, b);
}
}
return 0;
}