#include <stdio.h>
long arbint[400005];
long v[100005];
long maxim(long x, long y)
{
if (x > y) return x;
else return y;
}
void construieste(long nod, long st, long dr)
{
if (st == dr)
{
arbint[nod] = v[st];
return;
}
long mij = (st + dr) / 2;
construieste(2 * nod, st, mij);
construieste(2 * nod + 1, mij + 1, dr);
arbint[nod] = maxim(arbint[2 * nod], arbint[2 * nod + 1]);
}
void modifica(long nod, long st, long dr, long poz, long val)
{
if (st == dr)
{
arbint[nod] = val;
return;
}
long mij = (st + dr) / 2;
if (poz <= mij)
{
modifica(2 * nod, st, mij, poz, val);
}
else
{
modifica(2 * nod + 1, mij + 1, dr, poz, val);
}
arbint[nod] = maxim(arbint[2 * nod], arbint[2 * nod + 1]);
}
long intreaba(long nod, long st, long dr, long L, long R)
{
if (L <= st && dr <= R)
{
return arbint[nod];
}
long mij = (st + dr) / 2;
long rez_stang = -1, rez_drept = -1;
if (L <= mij)
{
rez_stang = intreaba(2 * nod, st, mij, L, R);
}
if (R > mij)
{
rez_drept = intreaba(2 * nod + 1, mij + 1, dr, L, R);
}
return maxim(rez_stang, rez_drept);
}
int main()
{
FILE *fin = fopen("arbint.in", "r");
FILE *fout = fopen("arbint.out", "w");
if (fin == NULL || fout == NULL) {
return 0;
}
long n, m;
if (fscanf(fin, "%ld %ld", &n, &m) != 2) {
fclose(fin); fclose(fout); return 0;
}
long i;
for (i = 1; i <= n; i++)
{
fscanf(fin, "%ld", &v[i]);
}
construieste(1, 1, n);
while (m > 0)
{
long tip, a, b;
fscanf(fin, "%ld %ld %ld", &tip, &a, &b);
if (tip == 0)
{
fprintf(fout, "%ld\n", intreaba(1, 1, n, a, b));
}
else if (tip == 1)
{
modifica(1, 1, n, a, b);
}
m--;
}
fclose(fin);
fclose(fout);
return 0;
}