#include <fstream>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
const int max_size = 1e5 + 1, max_aint = 4e5 + 1;
int aint[max_aint], a[max_size], ans;
void init (int nod, int l, int r)
{
if (l == r)
{
aint[nod] = a[l];
return;
}
int m = (l + r) / 2;
init(2 * nod, l, m);
init(2 * nod + 1, m + 1, r);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
void update (int val, int poz, int nod, int l, int r)
{
if (l == r)
{
aint[nod] = val;
return;
}
int m = (l + r) / 2;
if (poz <= m)
{
update(val, poz, 2 * nod, l, m);
}
else
{
update(val, poz, 2 * nod + 1, m + 1, r);
}
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
void querry (int nod, int l, int r, int st, int dr)
{
if (st <= l && r <= dr)
{
ans = max(ans, aint[nod]);
return;
}
int m = (l + r) / 2;
if (st <= m)
{
querry(2 * nod, l, m, st, dr);
}
if (m < dr)
{
querry(2 * nod + 1, m + 1, r, st, dr);
}
}
int main ()
{
int n, t;
in >> n >> t;
for (int i = 1; i <= n; i++)
{
in >> a[i];
}
init(1, 1, n);
while (t--)
{
int op, x, y;
in >> op >> x >> y;
if (op == 0)
{
ans = -1;
querry(1, 1, n, x, y);
out << ans << '\n';
}
else
{
update(y, x, 1, 1, n);
}
}
}