#include <stdio.h>
#include <stdlib.h>
#define AIL 131072
int *arb;
int N, M, a, arbsz;
int *vals;
int max(int a, int b) {
return a > b ? a : b;
}
void build(int idx, int l, int r) {
int m;
if (l == r) {
arb[idx] = vals[l];
} else {
m = (r + l)/2;
build(idx * 2, l, m);
build(idx * 2 + 1, m + 1, r);
arb[idx] = max(arb[idx * 2], arb[idx * 2 + 1]);
}
}
void update(int idx, int l, int r, int n, int v) {
int m, nm;
if (l == r) {
arb[idx] = v;
} else {
m = (r + l)/2;
if (n <= m) {
update(idx * 2, l, m, n, v);
} else {
update(idx * 2 + 1, m + 1, r, n, v);
}
arb[idx] = max(arb[idx * 2], arb[idx * 2 + 1]);
}
}
int answer(int idx, int l, int r, int ql, int qr) {
int m, lm = 0, rm = 0;
if (ql <= l && qr >= r) {
return arb[idx];
} else {
m = (l + r ) / 2;
if (ql <= m) {
lm = answer(idx * 2, l, m, ql, qr);
}
if (qr > m) {
rm = answer(idx * 2 + 1, m + 1, r, ql, qr);
}
return max(lm, rm);
}
}
int main() {
int i, j;
int op, n, v;
arbsz = 1;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d\n", &N, &M);
while (arbsz < 3 * N - 1) arbsz <<= 1;
arb = (int*) malloc(sizeof(int) * (arbsz + 1));
vals = (int*) malloc(sizeof(int) * (N + 1));
for (i = 1; i <= N; i++) {
scanf("%d", vals + i);
}
build(1, 1, N);
for(i = 1; i <= M; i++) {
scanf("%d %d %d", &op, &n, &v);
if (op == 1) {
update(1, 1, N, n, v);
} else {
printf("%d\n", answer(1, 1, N, n, v));
}
}
return 0;
}