#include <iostream>
#include <fstream>
#include <ctgmath>
std :: ifstream fin ("arbint.in");
std :: ofstream fout ("arbint.out");
int arbint[10000005];
int maxim;
void insert(int poz, int nod, int val, int st, int dr) {
if (st == dr) {
arbint[nod] = val;
return;
}
int mijloc = (st + dr ) / 2;
if (poz <= mijloc) {
insert(poz, 2*nod, val, st, mijloc);
} else {
insert (poz, 2*nod + 1, val, mijloc + 1, dr);
}
arbint[nod] = std :: max(arbint[2 * nod], arbint[2*nod + 1]);
}
void get(int nod, int st, int dr, int start, int final) {
if (start <= st and dr <= final) {
if( maxim < arbint[nod]) maxim = arbint[nod];
return;
}
int mijloc = (st + dr) / 2;
if (start <= mijloc) get(2*nod, st, mijloc, start, final);
if (mijloc < final) get(2*nod + 1, mijloc + 1, dr, start, final);
}
int main() {
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
int p;
fin >> p;
insert(i, 1, p, 1, n);
}
for (int i = 1; i <= m; ++i) {
int x, a, b;
fin >> x >> a >> b;
if (x == 0) {
maxim = -1;
get(1, 1, n, a, b);
fout << maxim << '\n';
} else {
insert(a, 1, b, 1, n);
}
}
return 0;
}