#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M;
int A, B, X, maxim;
int ArbMax[400100];
void Update(int pos, int val, int nod, int left, int right)
{
if (left == right)
{
ArbMax[nod] = val;
return;
}
int mij = (left + right) / 2;
if (pos <= mij) Update(pos, val, 2 * nod, left, mij);
else Update(pos, val, 2 * nod + 1, mij + 1, right);
(ArbMax[2 * nod] > ArbMax[2 * nod + 1]) ? (ArbMax[nod] = ArbMax[2 * nod]) : (ArbMax[nod] = ArbMax[2 * nod + 1]);
}
void GetMax(int start, int finish, int nod, int left, int right)
{
if (start <= left && right <= finish)
{
if (maxim < ArbMax[nod]) maxim = ArbMax[nod];
return;
}
int mij = (left + right) / 2;
if (start <= mij) GetMax(start, finish, 2 * nod, left, mij);
if (mij < finish) GetMax(start, finish, 2 * nod + 1, mij + 1, right);
}
int main()
{
fin >> M >> N;
for (int i = 1; i <= N; i++)
{
fin >> X;
Update(i, X, 1, 1, N);
}
for (int i = 1; i <= M; i++)
{
fin >> X >> A >> B;
if (X == 0)
{
maxim = -1;
GetMax(A, B, 1, 1, N);
fout << maxim << '\n';
}
else
{
Update(A, B, 1, 1, N);
}
}
}