#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[200005], n, m, x, k, a, b;
void update(int nod, int poz, int val, int st, int dr) {
if (st == dr) {
arb[nod] = val;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij) {
update(2 * nod, poz, val, st, mij);
} else {
update(2 * nod + 1, poz, val, mij + 1, dr);
}
arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
int query(int nod, int x, int y, int st, int dr) {
if (st >= x && dr <= y) {
return arb[nod];
}
int mij = (st + dr) / 2;
int max1 = 0, max2 = 0;
if (x <= mij)
max1 = query(2 * nod, x, y, st, mij);
if (mij + 1 <= y)
max2 = query(2 * nod + 1, x, y, mij + 1, dr);
return max(max1, max2);
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
fin >> x;
update(1, i, x, 1, n);
}
for(int i = 1; i <= m; i++)
{
fin >> k >> a >> b;
if(k == 0)
fout << query(1, a, b, 1, n) << '\n';
if(k == 1)
update(1, a, b, 1, n);
}
return 0;
}