#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
int graf[400000];
void update(int nod, int st, int dr, int val, int poz)
{
if (st == dr)
{
graf[nod] = val;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij)
update(nod * 2, st, mij, val, poz);
else
update(nod * 2 + 1, mij + 1, dr, val, poz);
graf[nod] = max(graf[nod * 2], graf[nod * 2 + 1]);
}
int querry(int nod, int st, int dr, int intSt, int intDr)
{
if (intSt <= st && dr <= intDr)
return graf[nod];
int mij = (st + dr) / 2;
int vmax = 0;
if (intSt <= mij)
vmax = querry(nod * 2, st, mij, intSt, intDr);
if (intDr > mij)
vmax = max(vmax, querry(nod * 2 + 1, mij + 1, dr, intSt, intDr));
return vmax;
}
int main()
{
int a, b, op, val, poz;
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
fin >> val;
update(1, 1, n, val, i);
}
for (int i = 1; i <= m; i++)
{
fin >> op >> a >> b;
if (op)
update(1, 1, n, b, a);
else
fout << querry(1, 1, n, a, b) << '\n';
}
return 0;
}