#include <array>
#include <fstream>
#include <vector>
std::array<int, 400010> arb;
void update (int poz, int val, int left, int right, int node) {
if (left == right && left == poz) {
arb[node] = val;
return;
}
int mid = (left + right) / 2;
if (left <= poz && poz <= mid)
update(poz, val, left, mid, node * 2);
else if (mid < poz && poz <= right)
update(poz, val, mid + 1, right, node * 2 + 1);
arb[node] = std::max(arb[node * 2], arb[node * 2 + 1]);
}
int query (int poz_left, int poz_right, int left, int right, int node) {
if (poz_left <= left && right <= poz_right)
return arb[node];
int mid = (left + right) / 2;
int result = -1;
if (poz_left <= mid)
result = std::max(result, query(poz_left, poz_right, left, mid, node * 2));
if (mid + 1 <= poz_right)
result = std::max(result, query(poz_left, poz_right, mid + 1, right, node * 2 + 1));
return result;
}
void build (int left, int right, int node, int v[]) {
if (left == right) {
arb[node] = v[left];
return;
}
int mid = (left + right) / 2;
build(left, mid, node * 2, v);
build(mid + 1, right, node * 2 + 1, v);
arb[node] = std::max(arb[node * 2], arb[node * 2 + 1]);
}
int main () {
std::ifstream in("arbint.in");
in.exceptions(std::ifstream::failbit);
std::ofstream out("arbint.out");
out.exceptions(std::ofstream::failbit);
int n, m;
int v[100001];
in >> n >> m;
for (int i = 1; i <= n; ++ i)
in >> v[i];
build(1, n, 1, v);
for (int i = 1; i <= m; ++ i) {
int tip, x, y;
in >> tip >> x >> y;
if (tip == 0) {
out << query(x, y, 1, n, 1) << '\n';
} else {
update(x, y, 1, n, 1);
}
}
}