#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
vector <int > arb(100001);
void Actualizare(int radacina, int stanga, int dreapta, int pozitie, int valoare)
{
if(stanga == dreapta) {
arb[radacina] = valoare;
return;
}
int mijloc = (stanga + dreapta)/2;
if(pozitie <= mijloc)
Actualizare(2 * radacina, stanga, mijloc, pozitie, valoare);
else
Actualizare(2 * radacina + 1, mijloc + 1, dreapta, pozitie, valoare);
arb[radacina] = max(arb[2 * radacina], arb[2 * radacina + 1]);
}
int Interogare(int radacina, int stanga, int dreapta, int x, int y)
{
if(x <= stanga && dreapta <= y)
return arb[radacina];
int maxim_stanga = 0, maxim_dreapta = 0;
int mijloc = (stanga + dreapta)/2;
if(x <= mijloc)
maxim_stanga = Interogare(2 * radacina, stanga, mijloc, x, y);
if(mijloc < y)
maxim_dreapta = Interogare(2 * radacina + 1, mijloc + 1, dreapta, x, y);
return max(maxim_stanga, maxim_dreapta);
}
int main()
{int n, m, x, y, val, i, op;
f>>n>>m;
for(i = 1; i <= n; i++)
{
f >> val;
Actualizare(1, 1, n, i, val);
}
for(i = 1; i <= m; i++)
{
f >> op >> x >> y;
if (op == 0)
g << Interogare(1, 1, n, x, y) <<"\n";
else
Actualizare(1, 1, n, x, y);
}
return 0;
}