#include <stdio.h>
#define MAX_SIZE 100001
int MaxArb[4 * MAX_SIZE + 66];
int max(int a, int b) {
return (a > b) ? a : b;
}
void update(int nod, int left, int right, int pos, int val) {
if (left == right) {
MaxArb[nod] = val;
return;
}
int mid = (left + right) / 2;
if (pos <= mid) {
update(2 * nod, left, mid, pos, val);
} else {
update(2 * nod + 1, mid + 1, right, pos, val);
}
MaxArb[nod] = max(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}
int query(int nod, int left, int right, int start, int finish) {
if (start > right || finish < left) {
return -1;
}
if (start <= left && right <= finish) {
return MaxArb[nod];
}
int mid = (left + right) / 2;
int leftMax = query(2 * nod, left, mid, start, finish);
int rightMax = query(2 * nod + 1, mid + 1, right, start, finish);
if (leftMax == -1) return rightMax;
if (rightMax == -1) return leftMax;
return max(leftMax, rightMax);
}
int main() {
int N, M;
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; i++) {
int X;
scanf("%d", &X);
update(1, 1, N, i, X);
}
for (int i = 0; i < M; i++) {
int op, A, B;
scanf("%d %d %d", &op, &A, &B);
if (op == 0) {
printf("%d\n", query(1, 1, N, A, B));
} else {
update(1, 1, N, A, B);
}
}
return 0;
}