#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
vector <int> Arbore , sir;
void Creare_Arbore (int nod , int stanga , int dreapta)
{
if (stanga == dreapta)
Arbore[nod] = sir[stanga];
else
{
int mijloc = (stanga + dreapta) / 2;
Creare_Arbore(2 * nod , stanga , mijloc);
Creare_Arbore(2 * nod + 1 , mijloc + 1 , dreapta);
Arbore[nod] = max(Arbore[2 * nod] , Arbore[2 * nod + 1]);
}
}
int Maxim (int nod , int stanga , int dreapta , int interval_stanga , int interval_dreapta)
{
if (interval_stanga <= stanga && dreapta <= interval_dreapta)
return Arbore[nod];
int mijloc = (stanga + dreapta) / 2 , maxim_1 = -2e9 , maxim_2 = -2e9;
if (interval_stanga <= mijloc)
maxim_1 = Maxim(2 * nod , stanga , mijloc , interval_stanga , interval_dreapta);
if (interval_dreapta > mijloc)
maxim_2 = Maxim(2 * nod + 1 , mijloc + 1 , dreapta , interval_stanga , interval_dreapta);
return max(maxim_1 , maxim_2);
}
void Inlocuire (int nod , int stanga , int dreapta , int pozitie , int valoare)
{
if (stanga == dreapta)
Arbore[nod] = valoare;
else
{
int mijloc = (stanga + dreapta) / 2;
if (pozitie <= mijloc)
Inlocuire(2 * nod , stanga , mijloc , pozitie , valoare);
else
Inlocuire(2 * nod + 1 , mijloc + 1 , dreapta , pozitie , valoare);
Arbore[nod] = max(Arbore[2 * nod] , Arbore[2 * nod + 1]);
}
}
int main ()
{
int lungime , operatii;
cin >> lungime >> operatii;
sir.resize(lungime + 1) , Arbore.resize(4 * lungime + 1);
for (int indice = 1 ; indice <= lungime ; indice++)
cin >> sir[indice];
Creare_Arbore(1 , 1 , lungime);
int tip , stanga , dreapta;
for (int indice = 1 ; indice <= operatii ; indice++)
{
cin >> tip >> stanga >> dreapta;
if (!tip)
cout << Maxim(1 , 1 , lungime , stanga , dreapta) << '\n';
else
Inlocuire(1 , 1 , lungime , stanga , dreapta);
}
cout.close(); cin.close();
return 0;
}