#include <fstream>
#include <cmath>
int aint[400005];
int querry(int l, int r, int nod, int il, int ir) {
if (l == il && r == ir) {
return aint[nod];
}
else {
int mid = (l + r) / 2, ans = 0;
if (il <= mid) {
ans = querry(l, mid, 2 * nod, il, std::min(mid, ir));
}
if (mid < ir) {
ans = std::max(ans, querry(mid + 1, r, 2 * nod + 1, std::max(mid + 1, il), ir));
}
return ans;
}
}
void update(int l, int r, int nod, int poz, int val) {
if (l == r) {
aint[nod] = val;
}
else {
int mid = (l + r) / 2;
if (poz <= mid) {
update(l, mid, 2 * nod, poz, val);
}
else {
update(mid + 1, r, 2 * nod + 1, poz, val);;
}
aint[nod] = std::max(aint[2 * nod], aint[2 * nod + 1]);
}
}
int main()
{
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
int nrn, nrm, nri, cer, l, r, poz, val;
fin >> nrn >> nrm;
for (int index = 1; index <= nrn; index++) {
fin >> nri;
update(1, nrn, 1, index, nri);
}
for (int index = 0; index < nrm; index++) {
fin >> cer;
if (cer) {
fin >> poz >> val;
update(1, nrn, 1, poz, val);
}
else {
fin >> l >> r;
fout << querry(1, nrn, 1, l, r) << std::endl;
}
}
}