#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
const int NMAX = 100000;
int arbore[4 * NMAX + 1];
void actualizeaza(int pozitie, int valoare, int nod, int a, int b) {
if (a == b) {
arbore[nod] = valoare;
return;
}
int m = (a + b) / 2;
if (pozitie <= m)
actualizeaza(pozitie, valoare, 2 * nod, a, m);
else
actualizeaza(pozitie, valoare, 2 * nod + 1, m + 1, b);
arbore[nod] = max(arbore[2 * nod], arbore[2 * nod + 1]);
}
int afla(int l, int r, int nod, int a, int b) {
if (l <= a && b <= r) return arbore[nod];
int m = (a + b) / 2;
int rez1 = -1;
int rez2 = -1;
if (l <= m) rez1 = afla(l, r, 2 * nod, a, m);
if (r > m) rez2 = afla(l, r, 2 * nod + 1, m + 1, b);
return max(rez1, rez2);
}
int main() {
int n, m, op, a, b;
f >> n >> m;
for (int i = 1; i <= n; i++) {
f >> a;
actualizeaza(i, a, 1, 1, n);
}
for (int i = 1; i <= m; i++) {
f >> op >> a >> b;
if (op == 1)
actualizeaza(a, b, 1, 1, n);
else
g << afla(a, b, 1, 1, n) << '\n';
}
return 0;
}