// Online C++ compiler to run C++ program online
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define inf 1e9 + 1
const int CAPACITY = 100013;
class SegmentTree
{
private:
int n;
int tree[CAPACITY * 4];
void update(int nodeId, int lower, int upper, int left, int right, int val)
{
if (lower > right || upper < left)
{
return;
}
if (left <= lower && upper <= right)
{
tree[nodeId] = val;
return;
}
int mid = (lower + upper) / 2;
update(nodeId * 2, lower, mid, left, right, val);
update(nodeId * 2 + 1, mid + 1, upper, left, right, val);
tree[nodeId] = max(tree[nodeId * 2], tree[nodeId * 2 + 1]);
}
int query(int nodeId, int lower, int upper, int left, int right)
{
if (lower > right || upper < left)
{
return -inf;
}
if (left <= lower && upper <= right)
{
return tree[nodeId];
}
int mid = (lower + upper) / 2;
int max0 = query(nodeId * 2, lower, mid, left, right);
int max1 = query(nodeId * 2 + 1, mid + 1, upper, left, right);
return max(max0, max1);
}
public:
SegmentTree(int n)
{
this->n = n;
fill(tree, tree + n, 0);
}
void set(int index, int value)
{
update(1, 1, n, index, index, value);
}
int query(int l, int r)
{
return query(1, 1, n, l, r);
}
};
int main()
{
int n, m, op, a, b;
fin >> n >> m;
SegmentTree segTree(n);
for (int i = 1; i <= n; ++i)
{
fin >> a;
segTree.set(i, a);
}
while (m-- > 0)
{
fin >> op >> a >> b;
if (op == 0)
{
fout << segTree.query(a, b) << "\n";
}
else if (op == 1)
{
segTree.set(a, b);
}
}
return 0;
}