#include <stdio.h>
int arbore[100000];
int maxim(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
void update(int nod, int st, int dr, int val, int pos)
{
if (st == dr)
{
arbore[nod] = val;
}
else
{
int div = (st + dr) / 2;
if (pos <= div)
{
update(2 * nod, st, div, val, pos);
}
else
{
update(2 * nod + 1, div + 1, dr, val, pos);
}
arbore[nod] = maxim(arbore[2 * nod], arbore[2 * nod + 1]);
}
}
int query(int nod, int st, int dr, int s, int f)
{
if (s <= st && dr <= f)
{
return arbore[nod];
}
int div = (st + dr) / 2;
int max = 0;
if (s <= div)
{
max = query(2 * nod, st, div, s, f);
}
if (div < f)
{
max = maxim(max, query(2 * nod + 1, div + 1, dr, s, f));
}
return max;
}
int main()
{
int n = 0;
int m = 0;
int val = 0;
int op = 0;
int s = 0;
int f = 0;
int maximum = 0;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
{
scanf("%d", &val);
update(1, 0, n - 1, val, i);
}
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &op, &s, &f);
if (op == 0)
{
maximum = -1;
maximum = query(1, 0, n - 1, s - 1, f - 1);
printf("%d\n", maximum);
}
else if (op == 1)
{
update(1, 0, n - 1, f, s - 1);
}
}
return 0;
}