#include <fstream>
#include <iostream>
std::ifstream in("arbint.in");
std::ofstream out("arbint.out");
int v[1000000], q;
size_t n;
void create(size_t node, size_t lhs, size_t rhs) {
if (lhs == rhs) {
in>>v[node];
return;
}
create(node * 2, lhs, (lhs + rhs) / 2);
create(node * 2 + 1, (lhs + rhs) / 2 + 1, rhs);
v[node] = std::max(v[node * 2], v[node * 2 + 1]);
}
void max_arb(size_t node, size_t a, size_t b, size_t lhs, size_t rhs) {
if (a <= lhs && rhs <= b) {
if (v[node] > q)
q = v[node];
}
else {
size_t mid = (lhs + rhs) / 2;
if (a <= mid)
max_arb(node * 2, a, b, lhs, mid);
if (mid + 1 <= b)
max_arb(node * 2 + 1, a, b, mid + 1, rhs);
}
}
void modify(int val, size_t pos, size_t node, size_t lhs, size_t rhs) {
if (lhs == rhs)
v[node] = val;
else {
size_t mid = (lhs + rhs) / 2;
if (pos <= mid)
modify(val, pos, node * 2, lhs, mid);
else
modify(val, pos, node * 2 + 1, mid + 1, rhs);
v[node] = std::max(v[node * 2], v[node * 2 + 1]);
}
}
int main() {
size_t m, o, i, a, b;
in>>n>>m;
create(1, 1, n);
for (i = 1; i <= m; ++i) {
in>>o>>a>>b;
if (o == 0) {
q = 0;
max_arb(1, a, b, 1, n);
out<<q<<"\n";
}
else
modify(b, a, 1, 1, n);
}
return 0;
}