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