#include <stdio.h>
#define NM (1 << 18)
#define md (l + r >> 1)
#define ls (n << 1)
#define rs (n << 1 | 1)
#define max(a, b) ((a) > (b) ? (a) : (b))
FILE *f, *g;
long rez, a, b;
long arb[NM];
void
query (int n, int l, int r)
{
if (a <= l && r <= b)
{
rez = max (rez, arb[n]);
return;
}
if (a <= md)
query (ls, l, md);
if (md + 1 <= b)
query (rs, md + 1, r);
}
void
update (int n, int l, int r)
{
if (l == r)
arb[n] = b;
else
{
if (a <= md)
update (ls, l, md);
else
update (rs, md + 1, r);
arb[n] = max (arb[ls], arb[rs]);
}
}
int
main ()
{
int x, i;
long n, m;
freopen ("arbint.in", "rt", stdin);
freopen ("arbint.out", "wt", stdout);
scanf ("%ld %ld\n", &n, &m);
for (i = 1; i <= n; i++)
{
scanf ("%ld", &b);
a = i;
update (1, 1, n);
}
while (m--)
{
scanf ("%d %ld %ld\n", &x, &a, &b);
if (x == 1)
update (1, 1, n);
else
{
rez = -1;
query (1, 1, n);
printf ("%ld\n", rez);
}
}
return 0;
}