#include <cstdio>
#define p1 ((poz) * 2)
#define p2 ((poz) * 2 + 1)
#define mij (((st) + (dr)) / 2)
int N, M;
int v[1 << 17];
int seg[1 << 18];
inline int max(int a, int b) { return (a > b ? a : b); }
void build(int poz, int st, int dr) {
if (st == dr) {
seg[poz] = v[st];
return;
}
build(p1, st, mij);
build(p2, mij+1, dr);
seg[poz] = max(seg[p1], seg[p2]);
}
int query(int poz, int st, int dr, int a, int b) {
if (a <= st && dr <= b) return seg[poz];
int best = 0;
if (a <= mij) best = max(best, query(p1, st, mij, a, b));
if (b > mij) best = max(best, query(p2, mij+1, dr, a, b));
return best;
}
void update(int poz, int st, int dr, int a, int b) {
if (st == dr) {
seg[poz] = b;
return;
}
if (a <= mij) update(p1, st, mij, a, b);
else update(p2, mij+1, dr, a, b);
seg[poz] = max(seg[p1], seg[p2]);
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; ++i)
scanf("%d", v+i);
build(1, 1, N);
for (int i = 0; i < M; ++i) {
int op, a, b;
scanf("%d %d %d", &op, &a, &b);
if (op == 0) printf("%d\n", query(1, 1, N, a, b));
else update(1, 1, N, a, b);
}
}