#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int numere[100000], arbore[500000], nrNumere, nrOperatii;
int mijloc(int stanga, int dreapta) {
return stanga + (dreapta - stanga) / 2;
}
void construireArbore(int stanga, int dreapta, int index) {
if (stanga == dreapta)
arbore[index] = numere[stanga];
else {
int mij = mijloc(stanga, dreapta);
construireArbore(stanga, mij, 2 * index);
construireArbore(mij + 1, dreapta, 2 * index + 1);
arbore[index] = max(arbore[index * 2], arbore[index * 2 + 1]);
}
}
int determinareMaxim(int a, int b, int stanga, int dreapta, int index) {
if (a <= stanga and dreapta <= b) {
return arbore[index];
} else {
if (a <= dreapta and b >= stanga) {
int mij = mijloc(stanga, dreapta);
return max(determinareMaxim(a, b, stanga, mij, 2 * index),
determinareMaxim(a, b, mij + 1, dreapta, 2 * index + 1));
}
}
return 0;
}
void afisare();
void actualizare(int stanga, int dreapta, int indexArbore, int indexSchimbat) {
//if (indexSchimbat >= stanga and indexSchimbat <= dreapta) {
if (stanga == dreapta) {
arbore[indexArbore] = numere[indexSchimbat];
} else {
int mij = mijloc(stanga, dreapta);
if (indexSchimbat <= mij)
actualizare(stanga, mij, indexArbore * 2, indexSchimbat);
else
actualizare(mij + 1, dreapta, indexArbore * 2 + 1, indexSchimbat);
arbore[indexArbore] = max(arbore[indexArbore * 2], arbore[indexArbore * 2 + 1]);
}
//}
}
int main() {
int index, operatie, a, b, stanga = 1, dreapta;
fin >> nrNumere >> nrOperatii;
dreapta = nrNumere;
for (index = 1; index <= nrNumere; index += 1) {
fin >> numere[index];
}
construireArbore(stanga, dreapta, 1);
for (index = 1; index <= nrOperatii; index += 1) {
fin >> operatie >> a >> b;
if (operatie == 0) {
fout << determinareMaxim(a, b, stanga, dreapta, 1) << "\n";
} else {
numere[a] = b;
actualizare(stanga, dreapta, 1, a);
}
}
return 0;
}