# include <cstdio>
const int N = 100000, Inf = 1000000000;
int t [1 << 18];
int n, m, a, poz, val, b, rez;
void fisiere ()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
}
int max (int x, int y)
{
if (x > y)
return x;
return y;
}
void query (int p, int st, int dr)
{
if (a <= st && dr <= b)
{
rez = t [p];
return;
}
int m = (st + dr) / 2, m1 = - Inf, m2 = - Inf;
if (a <= m)
{
query (2 * p, st, m);
m1 = rez;
}
if (m + 1 <= b)
{
query (2 * p + 1, m + 1, dr);
m2 = rez;
}
rez = max (m1, m2);
}
void update (int p, int st, int dr)
{
if (st == dr)
{
t [p] = val;
return;
}
int m = (st + dr) / 2;
if (poz <= m)
update (2 * p, st, m);
else
update (2 * p + 1, m + 1, dr);
t [p] = max (t [2 * p], t [2 * p + 1]);
}
void init_solve ()
{
int i, q;
fisiere ();
scanf ("%d %d" , & n, & m);
for (i = 1; i <= n; i ++)
{
scanf ("%d", & val);
poz = i;
update (1, 1, n);
}
for (i = 1; i <= m; i ++)
{
scanf ("%d %d %d", & q, & a, & b);
if (q == 0)
{
query (1, 1, n);
printf ("%d\n", rez);
}
else
{
val = b;
poz = a;
update (1, 1, n);
}
}
}
int main ()
{
init_solve ();
return 0;
}