#include <cstdio>
const int MAXN = 1e5;
int aint[2 * MAXN + 1], a, b;
inline int max(int x, int y) {
return x > y ? x : y;
}
void update(int poz, int l, int r) {
if (l == r) {
aint[poz] = b;
} else {
int mid = (l + r) >> 1;
if (a <= mid) {
update(2 * poz, l, mid);
} else {
update(2 * poz + 1, mid + 1, r);
}
aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
}
}
int query(int poz, int l, int r) {
if ((a <= l) && (r <= b)) {
return aint[poz];
}
int mid = (l + r) >> 1,
max1 = 0, max2 = 0;
if (a <= mid) {
max1 = query(2 * poz, l, mid);
}
if (mid < b) {
max2 = query(2 * poz + 1, mid + 1, r);
}
return max(max1, max2);
}
int main() {
int op, n, m;
FILE *fin = fopen("arbint.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (a = 1; a <= n; ++a) {
fscanf(fin, "%d", &b);
update(1, 1, n);
}
FILE *fout = fopen("arbint.out", "w");
for (int i = 0; i < m; ++i) {
fscanf(fin, "%d%d%d", &op, &a, &b);
if (op) {
update(1, 1, n);
} else {
fprintf(fout, "%d\n", query(1, 1, n));
}
}
fclose(fin);
fclose(fout);
return 0;
}