#include <iostream>
#include <fstream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
int arb[300000];
void update(int nod, int st, int dr, int a, int b, int el) {
//std::cout << nod << " " << st << " " << dr << "\n";
if (a <= st && dr <= b) {
arb[nod] = el;
} else {
int mij = (st + dr) / 2;
if (a <= mij)
update(nod * 2 + 1, st, mij, a, b, el);
if (b > mij)
update(nod * 2 + 2, mij + 1, dr, a, b, el);
arb[nod] = std::max( arb[nod * 2 + 1] , arb[nod * 2 + 2]);
}
}
int query(int nod, int st, int dr, int a, int b) {
//std::cout << nod << " " << st << " " << dr << "\n";
if (a <= st && dr <= b) {
return arb[nod];
}
int mij = (st + dr) / 2;
int ma = -1, mb = -1;
if (a <= mij)
ma = query(nod * 2 + 1, st, mij, a, b);
if (b > mij)
mb = query(nod * 2 + 2, mij + 1, dr, a, b);
return std::max(ma, mb);
}
int main() {
int n, m;
fin >> n >> m;
for (int i = 0; i < n; ++i)
{
int nr;
fin >> nr;
update(0, 0, n - 1, i, i, nr);
}
for (int i = 0; i < m; ++i)
{
int x, a, b;
fin >> x >> a >> b;
if (x == 0) {
fout << query(0, 0, n - 1, a - 1, b - 1) << "\n";
} else {
update(0, 0, n - 1, a - 1, a - 1, b);
}
}
// for (int i = 0; i < 100; ++i)
// {
// std::cout << arb[i] << " ";
// }
return 0;
}