#include <algorithm>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define nmax 100001
#define L (node << 1)
#define R (L | 1)
int H[nmax * 3];
int v[nmax];
inline void update(int node, int l, int r, int p, int v) {
if (l == r){H[node] = v; return;}
int m = (l + r) >> 1;
if (p <= m) update(L, l, m, p, v);
else
update(R, m + 1, r, p, v);
H[node] = max(H[L], H[R]);
}
inline int query(int node, int l, int r, int i, int j) {
if (i <= l && r <= j) return H[node];
int m = (l + r) >> 1;
int sol = 0;
if (i <= m)
sol = max(sol, query(L, l, m, i, j));
if (j > m)
sol = max(sol, query(R, m + 1, r, i, j));
return sol;
}
inline void build(int node, int l, int r) {
if (l == r){H[node] = v[l]; return;}
int m = (l + r) >> 1;
build(L, l, m);
build(R, m + 1, r);
H[node] = max(H[L], H[R]);
}
int i, n, m;
int op, a, b;
int main() {
fin >> n >> m;
for (i = 1; i <= n; ++i) fin >> v[i];
build(1, 1, n);
for (i = 1; i <= m; ++i) {
fin >> op >> a >> b;
if (op == 0)
fout << query(1, 1, n, a, b) << '\n';
if (op == 1)
update(1, 1, n, a, b);
}
return 0;
}