#include <cstdio>
#include <algorithm>
#define N 100000
using namespace std;
int n, m, s[N], h[4*N], x, a, b, rez;
void citire()
{
scanf ("%d %d ", &n, &m);
for (int i = 1; i <= n; ++ i)
scanf ("%d ", &s[i]);
}
void pune(int st, int dr, int nod)
{
if (st == dr)
{
h[nod] = s[st];
return;
}
int mij = (st + dr) >> 1, unde = (nod << 1);
pune (st, mij, unde);
pune (mij + 1, dr, unde +1);
h[nod] = max (h[unde], h[unde + 1]);
}
void maxim(int st, int dr, int nod)
{
if (a <= st && b >= dr)
{
rez = max (rez, h[nod]);
return;
}
if (st == dr)
return;
int mij = (st + dr) >> 1, unde = (nod << 1);
maxim (st, mij, unde);
maxim (mij + 1, dr, unde + 1);
h[nod] = max (h[unde], h[unde + 1]);
}
void modif(int st, int dr, int nod)
{
if (st == dr)
{
if (st == a)
h[nod] = b;
return;
}
int mij = (st + dr) >> 1, unde = (nod << 1);
modif (st, mij, unde);
modif (mij + 1, dr, unde + 1);
h[nod] = max (h[unde], h[unde + 1]);
}
void continua()
{
for (int i = 1; i <= m; ++ i)
{
scanf ("%d %d %d ", &x, &a, &b);
if (x == 0)
{
rez = 0;
maxim(1, n, 1);
printf ("%d\n", rez);
}
else
modif(1, n, 1);
}
}
int main()
{
freopen ("arbint.in", "r", stdin);
///freopen ("arbint.out", "w", stdout);
citire();
pune(1, n, 1);
continua();
return 0;
}