#include <fstream>
#include <iostream>
#define oo 0x7fffffff
using namespace std;
class SegmentTree
{
private:
int* v;
int* segTree;
int Size;
public:
SegmentTree(int Size)
{
this->Size = Size;
v = new int[Size];
segTree = new int[4 * Size + 1];
}
~SegmentTree()
{
delete[] v;
delete[] segTree;
}
void addNumber(int pos, int x)
{
v[pos] = x;
}
void buildSegmentTree(int low, int high, int root)
{
if(low == high)
segTree[root] = v[low];
else
{
int mid = (low + high) >> 1;
buildSegmentTree(low, mid, 2 * root + 1);
buildSegmentTree(mid + 1, high, 2 * root + 2);
segTree[root] = max(segTree[2 * root + 1], segTree[2 * root + 2]);
}
}
void updateSegmentTree(int low, int high, int root, int X, int Y)
{
// The value of the element X will become Y
if(low == high)
segTree[root] = Y;
else
{
int mid = (low + high) >> 1;
if(X <= mid) // The index is in the left subtree
updateSegmentTree(low, mid, 2 * root + 1, X, Y);
else
updateSegmentTree(mid + 1, high, 2 * root + 2, X, Y);
segTree[root] = max(segTree[2 * root + 1], segTree[2 * root + 2]);
}
}
int RMQ(int low, int high, int root, int Begin, int End)
{
if(Begin <= low && high <= End)
return segTree[root];
if(Begin > high || End < low)
return -oo;
int mid = (low + high) >> 1;
return max(RMQ(low, mid, 2 * root + 1, Begin, End),
RMQ(mid + 1, high, 2 * root + 2, Begin, End));
}
};
int main()
{
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, x, y, opType;
fin >> n >> m;
SegmentTree* sTree = new SegmentTree(n);
for(int i = 0; i < n; ++i)
{
fin >> x;
sTree->addNumber(i, x);
}
sTree->buildSegmentTree(0, n - 1, 0);
for(int i = 0; i < m; ++i)
{
fin >> opType >> x >> y;
if(opType == 0)
fout << sTree->RMQ(0, n - 1, 0, x - 1, y - 1) << "\n";
else
{
sTree->updateSegmentTree(0, n - 1, 0, x - 1, y);
}
}
delete sTree;
return 0;
}