#include <fstream>
#define NMAX 100010
using namespace std;
FILE *fin, *fout;
int n, m, ain[4 * NMAX];
void update(int x, int q, int st, int dr, int nod);
int calcul(int a, int b, int st, int dr, int nod);
int main()
{
int i, x, tip, a, b;
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
fscanf(fin, "%d%d", &n, &m);
for (i = 1; i <= n; i++)
{
fscanf(fin, "%d", &x);
update(i, x, 1, n, 1);
}
for (i = 1; i <= m; i++)
{
fscanf(fin, "%d%d%d", &tip, &a, &b);
if (!tip)
fprintf(fout, "%d\n", calcul(a, b, 1, n, 1));
else
update(a, b, 1, n, 1);
}
fclose(fout);
return 0;
}
void update(int x, int q, int st, int dr, int nod)
{
int mij = (st + dr) / 2;
if (st > dr)
return ;
if (st == dr && st == x)
ain[nod] = q;
else if (x <= mij)
{
update(x, q, st, mij, 2 * nod);
ain[nod] = max(ain[2 * nod], ain[2 * nod + 1]);
}
else if (x > mij)
{
update(x, q, mij + 1, dr, 2 * nod + 1);
ain[nod] = max(ain[2 * nod], ain[2 * nod + 1]);
}
return ;
}
int calcul(int a, int b, int st, int dr, int nod)
{
int x = 0, y = 0, mij = (st + dr) / 2;
if (st >= a && dr <= b)
return ain[nod];
if (a <= mij)
x = calcul(a, b, st, mij, 2 * nod);
if (b > mij)
y = calcul(a, b, mij + 1, dr, 2 * nod + 1);
return max(x, y);
}