#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int MAXN = 100005;
int arbore[4 * MAXN];
int n;
void actualizare(int nod, int st, int dr, int poz, int val)
{
if (st == dr)
{
arbore[nod] = val;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij)
actualizare(2 * nod, st, mij, poz, val);
else actualizare(2 * nod + 1, mij + 1, dr, poz, val);
arbore[nod] = max(arbore[2 * nod], arbore[2 * nod + 1]);
}
int interogare(int nod, int st, int dr, int sti, int dri)
{
if (st == sti && dr == dri)
return arbore[nod];
int mij = (st + dr) / 2;
if (dri <= mij)
return interogare(2 * nod, st, mij, sti, dri);
if (sti > mij)// >= mij + 1
return interogare(2 * nod + 1, mij + 1,dr, sti, dri);
return max(interogare(2 * nod, st, mij, sti, mij),
interogare(2 * nod + 1, mij + 1, dr, mij + 1, dri));
}
void citire(int &m)
{
in >> n >> m;
for (int i = 1;i <= n;++i)
{
int x;
in >> x;
actualizare(1, 1, n, i, x);
}
}
int main()
{
int m;
citire(m);
while (m > 0)
{
int t,a,b;
in >> t >> a >> b;
if (t == 0)//interogare
out << interogare(1, 1, n, a, b) << '\n';
else actualizare(1, 1, n, a, b);
--m;
}
return 0;
}