#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int nmax = 100005;
int n, m, arb[4*nmax+5], maxim;
void Actualizare(int st, int dr, int poz, int val, int nod) {
if (st == dr) {
arb[nod] = val;
return;
}
int m = (st + dr) / 2;
if (poz <= m)
Actualizare(st, m, poz, val, 2 * nod);
else
Actualizare(m + 1, dr, poz, val, 2 * nod + 1);
arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
void GasesteMaxim(int st, int dr, int a, int b, int nod) {
if (st >= a && dr <= b) {
if (arb[nod] > maxim)
maxim = arb[nod];
return;
}
int m = (st + dr) / 2;
if (m >= a)
GasesteMaxim(st, m, a, b, 2 * nod);
if (m < b)
GasesteMaxim(m + 1, dr, a, b, 2 * nod + 1);
}
int main() {
int i, x, a, b;
fin >> n >> m;
for (i = 1; i <= n; i++) {
fin >> x;
Actualizare(1, n, i, x, 1);
}
for (i = 1; i <= m; i++) {
fin >> x >> a >> b;
if (x == 1)
Actualizare(1, n, a, b, 1);
else {
maxim = -1;
GasesteMaxim(1, n, a, b, 1);
fout << maxim << '\n';
}
}
fout.close();
return 0;
}