#include <stdio.h>
#include <stdlib.h>
int maxim(const int a, const int b) {
if(a > b) return a;
return b;
}
void update(int *arr, int node, int left, int right, int pos, int val) {
if(left == right) {
arr[node] = val;
return;
}
int div = left + (right - left) / 2;
if (pos <= div) update (arr, 2 * node, left, div, pos, val);
else update (arr, 2 * node + 1, div + 1, right, pos, val);
arr[node] = maxim(arr[2 * node], arr[2 * node + 1]);
}
void query(int *arr, int node, int left, int right, int start, int finish, int *max) {
if(start <= left && right <= finish) {
if(*max < arr[node]) *max = arr[node];
return;
}
int div = left + (right - left) / 2;
if (start <= div) query(arr, 2 * node, left, div, start, finish, max);
if (div < finish) query(arr, 2 * node + 1, div + 1, right, start, finish, max);
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
int *arr = malloc(sizeof(int) * (4 * n + 66));
for(int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
update(arr, 1, 1, n, i, x);
}
for(int i = 1; i <= m; i++) {
int x, a, b;
scanf("%d %d %d", &x, &a, &b);
if(x == 0) {
int max = -1;
query(arr, 1, 1, n, a, b, &max);
printf("%d\n", max);
} else {
update(arr, 1, 1, n, a, b);
}
}
printf("\n");
free(arr);
}