#include <stdio.h>
#include <stdlib.h>
int N, M;
int A[100005];
int B[400040];
void build(int l, int r, int idb) {
int m;
m = (l + r) / 2;
if (l == r) {
B[idb] = A[l];
return;
}
build(l, m, idb * 2);
build(m + 1, r, idb * 2 + 1);
B[idb] = (B[2 * idb] > B[2 * idb + 1] ? B[2 * idb] : B[2 * idb + 1]);
}
int maxint(int a, int b, int id, int l, int r) {
int m, x = -1, y = -1;
m = (a + b) / 2;
if (a >= l && b <= r)
return B[id];
if (l <= m)
x = maxint(a, m, id * 2, l, r);
if (r > m)
y = maxint(m + 1, b, id * 2 + 1, l, r);
return (x > y ? x : y);
}
void change(int l, int r, int ida, int idb, int val) {
int m, x, y;
m = (l + r) / 2;
if (l == r) {
B[idb] = val;
return;
}
if (ida <= m)
change(l, m, ida, 2 * idb, val);
else
change(m + 1, r, ida, 2 * idb + 1, val);
x = B[2 * idb + 1];
y = B[2 * idb];
B[idb] = (x > y ? x : y);
}
int main() {
FILE *fi;
FILE *fo;
int i, op, a, b;
fi = fopen("arbint.in", "r");
fo = fopen("arbint.out", "w");
fscanf(fi, "%d%d", &N, &M);
for (i = 1; i <= N; i++) {
fscanf(fi, "%d", &A[i]);
}
build(1, N, 1);
for (i = 1; i <= M; i++) {
fscanf(fi, "%d%d%d", &op, &a, &b);
if (op == 0) {
fprintf(fo, "%d\n", maxint(1, N, 1, a, b));
} else {
change(1, N, a, 1, b);
}
}
fclose(fi);
fclose(fo);
return 0;
}