#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N, M, m;
int vect[400067];
void creare(int nod, int left, int right, int poz, int Val)
{
if (left == right)
{
vect[nod] = Val;
return;
}
int mij = (left + right) / 2;
if (poz <= mij)
creare(2 * nod, left, mij, poz, Val);
else
creare(2 * nod + 1, mij + 1, right, poz, Val);
vect[nod] = max(vect[2 * nod], vect[2 * nod + 1]);
}
void creare2(int nod, int left, int right, int start, int finish)
{
if (start <= left && right <= finish)
{
if (m < vect[nod])
m = vect[nod];
return;
}
int mij = (left + right) / 2;
if (start <= mij) creare2(2 * nod, left, mij, start, finish);
if (mij < finish) creare2(2 * nod + 1, mij + 1, right, start, finish);
}
int main()
{
int X, A, B;
f >> N >> M;
for (int i = 1; i <= N; i++)
{
f >> X;
creare(1, 1, N, i, X);
}
for (int i = 1; i <= M; i++)
{
f >> X >> A >> B;
if (X == 0)
{
m = -1;
creare2(1, 1, N, A, B);
g << m << "\n";
}
else
{
creare(1, 1, N, A, B);
}
}
}