#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100005;
int arbint[4 * maxn], v[maxn];
void build(int nod, int left, int right)
{
int m;
m = (left + right) / 2;
if(left == right) {
arbint[nod] = v[left];
return;
}
build(2 * nod, left, m);
build(2 * nod + 1, m + 1, right);
arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}
void update(int nod, int left, int right, int x, int y)
{
int m;
m = (left + right) / 2;
if(left == x) {
arbint[nod] = y;
return;
}
if(x <= m)
update(2 * nod, left, m, x, y);
else
update(2 * nod + 1, m + 1, right, x, y);
arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
//fprintf(stderr, "%d %d %d\n", left, right, arbint[nod]);
}
int query(int nod, int left, int right, int x, int y)
{
int m, rl = 0, rr = 0;
m = (left + right) / 2;
if(left >= x && right <= y) {
return arbint[nod];
}
if(x <= m)
rl = query(2 * nod, left, m, x, y);
if(y > m)
rr = query(2 * nod + 1, m + 1, right, x, y);
return max(rl, rr);
}
int main()
{
int i, n, m, tip, a, b;
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i = 1; i <= n; ++i)
scanf("%d", &v[i]);
build(1, 1, n);
for(i = 1; i <= m; ++i) {
scanf("%d %d %d", &tip, &a, &b);
if(tip == 0) {
printf("%d\n", query(1, 1, n, a, b));
//fprintf(stderr, "\n");
}
else
update(1, 1, n, a, b);
}
return 0;
}