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