#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int noduri[4000001], valori[1000001];
void valoareNod(int nod, int st, int dr)
{
if (st == dr)
{
noduri[nod] = valori[st];
return;
}
valoareNod(nod * 2, st, (st + dr) / 2);
valoareNod(nod * 2 + 1, (st + dr) / 2 + 1, dr);
noduri[nod] = max(noduri[2 * nod], noduri[2 * nod + 1]);
}
void modificareNod(int indiceNod, int st, int dr, int valInitiala, int valNoua)
{
if (valInitiala < st || valInitiala > dr) return;
if (st == dr)
{
noduri[indiceNod] = valNoua;
return;
}
modificareNod(indiceNod * 2, st, (st + dr) / 2, valInitiala, valNoua);
modificareNod(indiceNod * 2 + 1, (st + dr) / 2 + 1, dr, valInitiala, valNoua);
noduri[indiceNod] = max(noduri[indiceNod * 2], noduri[indiceNod * 2 + 1]);
}
int valMaxima(int indiceNod, int st, int dr, int val1, int val2)
{
if (val2 < st || dr < val1) return 0;
if (val1 <= st && dr <= val2) return noduri[indiceNod];
return max(valMaxima(2 * indiceNod, st, (st + dr) / 2, val1, val2),
valMaxima(2 * indiceNod + 1, (st + dr) / 2 + 1, dr, val1, val2));
}
int main()
{
int nrElemente, nrOperatii;
fin >> nrElemente >> nrOperatii;
for (int i = 1; i <= nrElemente; i++)
fin >> valori[i];
valoareNod(1, 1, nrElemente);
for (int i = 1; i <= nrOperatii; i++)
{
int operatie; fin >> operatie;
int a, b; fin >> a >> b;
switch (operatie)
{
case 0:
fout << valMaxima(1, 1, nrElemente, a, b) << '\n';
break;
case 1:
modificareNod(1, 1, nrElemente, a, b);
break;
}
}
}