#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
struct WizardTower
{
vector <int> aint;
WizardTower(int n)
{
int sz = 1;
while (sz < n)
sz *= 2;
aint.resize(2 * sz);
}
void Update(int currentNode, int left, int right, int poz, int x)
{
if (right < poz or left > poz)
return;
if (left == right)
{
aint[currentNode] = x;
return;
}
int mij = (left + right) / 2;
int lson = 2 * currentNode, rson = 2 * currentNode + 1;
Update(lson, left, mij, poz, x);
Update(rson, mij + 1, right, poz, x);
aint[currentNode] = max(aint[lson], aint[rson]);
}
void Update(int poz, int x)
{
Update(1, 1, n, poz, x);
}
int Query(int currentNode, int left, int right, int leftQuery, int rightQuery)
{
if (rightQuery < left or leftQuery > right)
return 0;
if (left >= leftQuery and right <= rightQuery)
return aint[currentNode];
int mij = (left + right) / 2;
int lson = 2 * currentNode, rson = 2 * currentNode + 1;
int x1 = Query(lson, left, mij, leftQuery, rightQuery );
int x2 = Query(rson, mij + 1, right, leftQuery, rightQuery);
return max(x1, x2);
}
int Query(int x, int y)
{
return Query(1, 1, n, x, y);
}
};
int main()
{
int i, x, y, op;
fin >> n >> m;
WizardTower tree(n);
for (i = 1; i <= n; i++)
{
fin >> x;
tree.Update(i, x);
}
while (m--)
{
fin >> op >> x >> y;
if (op == 1)
tree.Update(x, y);
else
fout << tree.Query(x, y) << "\n";
}
return 0;
}