#include <iostream>
#include <fstream>
using namespace std;
int N, M;
int tree[4 * 100001 + 100];
void update(int,int,int, int, int);
void query(int, int, int, int, int, int&);
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
// Program
f >> N >> M;
for (int i = 1; i <= N; i++)
{
int value;
f >> value;
update(1, 1, N, i, value);
}
for (int i = 0; i < M; i++)
{
int c, a, b;
f >> c >> a >> b;
// Query
if (c == 0)
{
int maximum = -1;
query(1, 1, N, a, b, maximum);
g << maximum << endl;
}
// c == 1
else
{
update(1, 1, N, a, b);
}
}
// Exit
f.close();
g.close();
return 0;
}
void update(int treePos, int treeStart, int treeEnd, int intervalPosition, int value)
{
if (treeStart == treeEnd)
{
tree[treePos] = value;
return;
}
int mij = (treeStart + treeEnd) / 2;
if (intervalPosition <= mij)
update(2 * treePos, treeStart, mij, intervalPosition, value);
else
update(2 * treePos + 1, mij + 1, treeEnd, intervalPosition, value);
tree[treePos] = max(tree[2 * treePos], tree[2 * treePos + 1]);
}
void query(int treePos, int treeStart, int treeEnd, int intervalStart, int intervalEnd, int& maximum)
{
if (intervalStart <= treeStart && treeEnd <= intervalEnd)
{
maximum = max(maximum, tree[treePos]);
return;
}
int mij = (treeStart + treeEnd) / 2;
if (intervalStart <= mij) query(2 * treePos, treeStart, mij, intervalStart, intervalEnd, maximum);
if (mij + 1 <= intervalEnd) query(2 * treePos + 1, mij + 1, treeEnd, intervalStart, intervalEnd, maximum);
}