#include <bits/stdc++.h>
const int N = 100000;
int a[N], t[N << 1];
int get_id(int l, int r)
{
return l + r | l != r;
}
void build(int l, int r)
{
int id = get_id(l, r);
if (l == r) {
t[id] = a[l];
} else {
int m = l + r >> 1;
build(l, m);
build(m + 1, r);
t[id] = std::max(t[get_id(l, m)], t[get_id(m + 1, r)]);
}
}
void update(int l, int r, int pos, int val)
{
int id = get_id(l, r);
if (l == r) {
t[id] = val;
} else {
int m = l + r >> 1;
if (pos <= m) {
update(l, m, pos, val);
} else {
update(m + 1, r, pos, val);
}
t[id] = std::max(t[get_id(l, m)], t[get_id(m + 1, r)]);
}
}
int eval(int l, int r, int q_l, int q_r)
{
int id = get_id(l, r);
if (q_l <= l && r <= q_r) {
return t[id];
} else {
int m = l + r >> 1;
int ans = 0;
if (q_l <= m) {
ans = std::max(ans, eval(l, m, q_l, q_r));
}
if (m < q_r) {
ans = std::max(ans, eval(m + 1, r, q_l, q_r));
}
return ans;
}
}
int main()
{
#ifdef INFOARENA
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
#endif
int n, q;
scanf("%d%d", &n, &q);
for (int i = 0; i < n; ++i) {
scanf("%d", a + i);
}
build(0, n - 1);
while (q--> 0) {
int o, a, b;
scanf("%d%d%d", &o, &a, &b);
--a;
if (o == 0) {
printf("%d\n", eval(0, n - 1, a, b - 1));
} else {
update(0, n - 1, a, b);
}
}
}