#include <cstdio>
#include <algorithm>
using namespace std;
int v[1 << 19], poz, x, y;
inline void add (int nod, int a, int b)
{
if (a == poz && poz == b)
{
v[nod] = x;
return;
}
int m = (a + b) / 2;
if (poz <= m) add (nod * 2, a, m);
else add (nod * 2 + 1, m + 1, b);
v[nod] = max (v[2 * nod], v[2 * nod + 1]);
}
inline int ask (int nod, int a, int b)
{
if (x <= a && b <= y) return v[nod];
int m = (a + b) / 2, x1 = 0, x2 = 0;
if (x <= m) x1 = ask (2 * nod, a, m);
if (y > m) x2 = ask (2 * nod + 1, m + 1, b);
return max (x1, x2);
}
int main ()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
int n, m;
scanf ("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf ("%d", &x);
poz = i;
add (1, 1, n);
}
for (int i = 1; i <= m; i++)
{
int op, a, b;
scanf ("%d %d %d", &op, &a, &b);
if (!op)
{
x = a;
y = b;
printf ("%d\n", ask (1, 1, n));
}
else
{
poz = a;
x = b;
add (1, 1, n);
}
}
return 0;
}