#include <fstream>
#include <vector>
#include <cassert>
using namespace std;
void update(int n, int l, int r, int p, int val, vector<int>& V) {
if (l >= r) {
assert(l == r && l == p);
V[n] = val;
return;
}
int m = (l + r) / 2;
if (p <= m)
update(2 * n, l, m, p, val, V);
else
update(2 * n + 1, m + 1, r, p, val, V);
V[n] = max(V[2 * n], V[2 * n + 1]);
}
int getMax(int n, int l, int r, int a, int b, vector<int> & V) {
assert(l <= r);
if (a <= l && r <= b) {
return V[n];
}
int m = (l + r) / 2;
int val = 0;
if (a <= m)
val = getMax(2 * n, l, m, a, b, V);
if (b >= m + 1)
val = max(val, getMax(2 * n + 1, m + 1, r, a, b, V));
return val;
}
int main() {
ifstream f("arbint.in");
ofstream g("arbint.out");
int N, M;
f >> N >> M;
vector<int> V(4 * N + 10);
for (int i = 1; i <= N; i++) {
int x;
f >> x;
update(1, 1, N, i, x, V);
}
for (int i = 0; i < M; i++) {
int op, a, b;
f >> op >> a >> b;
if (op == 1)
update(1, 1, N, a, b, V);
else
g << getMax(1, 1, N, a, b, V) << '\n';
}
f.close();
g.close();
return 0;
}