#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstdio>
using namespace std;
int n, m;
int aint[262145];
int maxim, A, B, poz, val;
inline void Update(int nod, int left, int right)
{
if (left == right)
{
aint[nod] = val;
return ;
}
int mij = (left + right)/2;
if (poz <= mij)
Update (nod*2, left, mij);
else
Update (nod*2+1, mij+1, right);
aint[nod] = max (aint[nod*2], aint[nod*2+1]);
}
inline void Query (int nod, int left, int right)
{
if (A <= left && right <= B)
{
if (aint[nod] > maxim)
maxim = aint[nod];
return ;
}
int mij;
mij = (left + right)/2;
if (A <= mij)
Query (nod*2, left, mij);
if (mij < B)
Query (nod*2+1, mij+1, right);
}
int main()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
scanf ("%d %d", &n, &m);
int i, cod, x, y;
for (i=1; i<=n; i++)
{
scanf ("%d", &val);
poz = i;
Update(1, 1, n);
}
for (i=1; i<=m; i++)
{
scanf ("%d %d %d", &cod, &x, &y);
if (cod == 0)
{
maxim = -1;
A = x;
B = y;
Query (1, 1, n);
printf ("%d\n", maxim);
}
else
{
poz = x;
val = y;
Update(1, 1, n);
}
}
return 0;
}