#include <cmath>
#include <cstdio>
#include <vector>
#define MAX -1
struct IntervalTree {
IntervalTree(int n_) : n(n_) {
size = 1 << ((int) (std::log(n) / std::log(2)));
if (size < n) {
size <<= 1;
}
container.resize(size * 2);
}
void readData() {
for (int i = 0; i < n; i++) {
scanf("%d", &container[size + i]);
}
for (int i = n + size; i < 2 * size; i++) {
container[i] = MAX;
}
int aux = size >> 1;;
while (aux) {
for (int i = aux; i < 2 * aux; i++) {
container[i] = container[2 * i + 1];
if (container[i] < container[2 * i]) {
container[i] = container[2 * i];
}
}
aux >>= 1;
}
}
void update(int pos, int value) {
pos = size + pos - 1;
container[pos] = value;
do {
pos >>= 1;
container[pos] = std::max(container[2 * pos], container[2 * pos + 1]);
} while (pos);
}
int findMax(int a, int b) {
return findMax(a, b, 1, size, 1);
}
int findMax(int a, int b, int left, int right, int pos) {
if (a == left && b == right) {
return container[pos];
}
int mid = (left + right) >> 1;
if (a > mid) {
return findMax(a, b, mid + 1, right, 2 * pos + 1);
} else if (b <= mid) {
return findMax(a, b, left, mid, 2 * pos);
} else {
return std::max(findMax(a, mid, left, mid, 2 * pos),
findMax(mid + 1, b, mid + 1, right, 2 * pos + 1));
}
}
int n;
int size;
std::vector<int> container;
};
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m, op, a, b;
scanf("%d %d", &n, &m);
IntervalTree tree(n);
tree.readData();
while (m-- > 0) {
scanf("%d %d %d", &op, &a, &b);
if (op == 0) {
printf("%d\n", tree.findMax(a, b));
} else {
tree.update(a, b);
}
}
return 0;
}