#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M;
int a, b, type, maxim;
int AINT[1 << 18];
void query(int nod, int lt, int rt, int start, int finish)
{
if (start <= lt && rt <= finish)
{
maxim = max(AINT[nod], maxim);
return;
}
if (lt == rt)
return;
int mid = (lt + rt) >> 1;
if (start <= mid)
query(nod * 2, lt, mid, start, finish);
if (mid < finish)
query(nod * 2 + 1, mid + 1, rt, start, finish);
}
void update(int nod, int lt, int rt, int pos, int x)
{
if (lt == rt)
{
AINT[nod] = x;
return;
}
int mid = (lt + rt) / 2;
if (pos <= mid)
update(nod * 2, lt, mid, pos, x);
else
update(nod * 2 + 1, mid + 1, rt, pos, x);
AINT[nod] = max(AINT[nod * 2], AINT[nod * 2 + 1]);
}
int main()
{
fin >> N >> M;
for (int i = 1, x; i <= N; ++i)
{
fin >> x;
update(1, 1, N, i, x);
}
for (int i = 1; i <= N; ++i)
{
fin >> type >> a >> b;
if (type == 0)
{
maxim = 0;
query(1, 1, N, a, b);
fout << maxim << '\n';
}
else
update(1, 1, N, a, b);
}
fin.close();
fout.close();
return 0;
}