#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int N = 100000;
int n, m;
int v[N + 5];
int aint[4 * N + 5];
void build(int nod, int st, int dr) {
if (st == dr) {
aint[nod] = v[st];
return;
}
int m = (st + dr) / 2;
build(2 * nod, st, m);
build(2 * nod + 1, m + 1, dr);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
void update(int nod, int st, int dr, int poz, int val) {
if (st == dr) {
aint[nod] = val;
return;
}
int m = (st + dr) / 2;
if (poz <= m)
update(2 * nod, st, m, poz, val);
else
update(2 * nod + 1, m + 1, dr, poz, val);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
int query(int nod, int st, int dr, int qst, int qdr) {
if (qst == st && qdr == dr)
return aint[nod];
int m = (st + dr) / 2;
int a = 0, b = 0;
if (qst <= m)
a = query(2 * nod, st, m, qst, min(m, qdr));
if (m + 1 <= qdr)
b = query(2 * nod + 1, m + 1, dr, max(m + 1, qst), qdr);
return max(a, b);
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> v[i];
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int t, a, b;
fin >> t >> a >> b;
if (t == 1)
update(1, 1, n, a, b);
else
fout << query(1, 1, n, a, b) << "\n";
}
return 0;
}