#include <stdio.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
// 2 ^ 18 + 1
int arb[262145];
void update(int p, int st, int dr, int poz, int val) {
if (st == dr) {
arb[p] = val;
return;
}
int m = (st + dr) / 2;
if (poz <= m) {
update(2*p, st, m, poz, val);
} else {
update(2*p+1, m + 1, dr, poz, val);
}
arb[p] = MAX(arb[2*p], arb[2*p+1]);
}
int query(int p, int st, int dr, int a, int b) {
if (a <= st && dr <= b) {
return arb[p];
}
int m = (st + dr) / 2, mst = 0, mdr = 0;
if (a <= m) {
mst = query(2 * p, st, m, a, b);
}
if (b > m) {
mdr = query(2 * p + 1, m + 1, dr, a, b);
}
return MAX(mst, mdr);
}
int main() {
FILE *fin = fopen("arbint.in", "r"),
*fout = fopen("arbint.out", "w");
int n, m, e;
int i, op, a, b;
fscanf(fin, "%d%d", &n, &m);
for (i = 0; i < n; i++) {
fscanf(fin, "%d", &e);
update(1, 0, n - 1, i, e);
}
for (; m > 0; m--) {
fscanf(fin, "%d%d%d", &op, &a, &b);
if (op == 0) {
a--; b--;
fprintf(fout, "%d\n", query(1, 0, n - 1, a, b));
} else {
a--;
update(1, 0, n - 1, a, b);
}
}
fclose(fin);
fclose(fout);
return 0;
}