#include <cstdio>
#include <algorithm>
using namespace std;
int v[1 << 19];
inline void add (int i, int nod, int a, int b, int x)
{
if (a == i && i == b)
{
v[nod] = x;
return;
}
int m = (a + b) / 2;
if (i <= m) add (i, nod * 2, a, m, x);
else add (i, nod * 2 + 1, m + 1, b, x);
v[nod] = max (v[2 * nod], v[2 * nod + 1]);
}
inline int ask (int nod, int a, int b, int x, int y)
{
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, x, y);
if (y > m) x2 = ask (2 * nod + 1, m + 1, b, x, y);
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++)
{
int x;
scanf ("%d", &x);
add (i, 1, 1, n, x);
}
for (int i = 1; i <= m; i++)
{
int op, a, b;
scanf ("%d %d %d", &op, &a, &b);
if (!op) printf ("%d\n", ask (1, 1, n, a, b));
else add (a, 1, 1, n, b);
}
return 0;
}