#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int nrElemente, nrOperatii, arbore[1000001], element, a, b, maxim, operatie;
void update(int nod, int stanga, int dreapta, int valoare, int pozitie) {
if (stanga == dreapta) {
arbore[nod] = valoare;
return;
}
if (pozitie <= (stanga + dreapta) / 2)
update(nod * 2, stanga, (stanga + dreapta) / 2, valoare, pozitie);
else
update(nod * 2 + 1, (stanga + dreapta) / 2 + 1, dreapta, valoare, pozitie);
arbore[nod] = max(arbore[nod * 2], arbore[nod * 2 + 1]);
}
void maximarb(int nod, int stanga, int dreapta, int inceput, int final) {
if (inceput <= stanga && dreapta <= final) {
maxim = max(maxim, arbore[nod]);
return;
}
if (inceput <= (stanga + dreapta) / 2)
maximarb(nod * 2, stanga, (stanga + dreapta) / 2, inceput, final);
if ((stanga + dreapta) / 2 < final)
maximarb(nod * 2 + 1, (stanga + dreapta) / 2 + 1, dreapta, inceput, final);
}
int main() {
in >> nrElemente >> nrOperatii;
for (int i = 1; i <= nrElemente; i++) {
in >> element;
update(1, 1, nrElemente, element, i);
}
for (int i = 1; i <= nrOperatii; i++) {
in >> operatie >> a >> b;
if (operatie == 0) {
maxim = -1;
maximarb(1, 1, nrElemente, a, b);
out << maxim << '\n';
} else if (operatie == 1) {
update(1, 1, nrElemente, b, a);
}
}
return 0;
}