#include <iostream>
#include <fstream>
int arb[100000 * 4];
void update(int nod, int st, int dr, int poz, int val)
{
if (st == dr)
{
arb[nod] = val;
}
else
{
int mid = st + (dr - st) / 2;
if (poz <= mid)
update(nod * 2 + 1, st, mid, poz, val);
else
update(nod * 2 + 2, mid + 1, dr, poz, val);
arb[nod] = std::max(arb[nod * 2 + 1], arb[nod * 2 + 2]);
}
}
void query(int nod, int st, int dr, int x, int y, int& rez)
{
if (st >= x && dr <= y)
{
if (rez < arb[nod])rez = arb[nod];
}
else
{
int mid = st + (dr - st) / 2;
if (x <= mid)
query(nod * 2 + 1, st, mid, x, y, rez);
if (mid < y)
query(nod * 2 + 2, mid + 1, dr, x, y, rez);
}
}
int main()
{
std::ifstream f("arbint.in");
std::ofstream g("arbint.out");
int n, m, tip, x , y;
f >> n >> m;
for (int i = 0; i < n; ++i)
{
f >> x;
update(0, 0, n - 1, i, x);
}
for (int i = 0; i < m; ++i)
{
f >> tip >> x >> y;
switch (tip)
{
case 0:
{
int rez = -1;
query(0, 0, n - 1, x-1, y-1, rez);
g << rez << '\n';
break;
}
case 1: update(0, 0, n - 1, x-1, y); break;
}
}
}