#include <stdio.h>
#include <stdlib.h>
FILE *f, *g;
int getMaxValue(int x, int y) {
return ( (x > y)? x:y );
}
void createSegmentTree(int node, int left, int right, int *arr, int *sgmTree) {
if (left == right) {
fscanf(f, "%d", &arr[left]);
sgmTree[node] = arr[left];
} else {
int mid = (left + right) / 2;
createSegmentTree(2 * node, left, mid, arr, sgmTree);
createSegmentTree(2 * node + 1, mid + 1, right, arr, sgmTree);
sgmTree[node] = getMaxValue(sgmTree[2 * node], sgmTree[2 * node + 1]);
}
}
int getMaximum(int node, int left, int right, int leftSegment, int rightSegment, int* sgmTree) {
if (leftSegment <= left && right <= rightSegment) {
return sgmTree[node];
} else {
int leftMaximum = 0;
int rightMaximum = 0;
int mid = (left + right) / 2;
if (mid >= leftSegment) {
leftMaximum = getMaximum(2 * node, left, mid, leftSegment, rightSegment, sgmTree);
}
if (mid + 1 <= rightSegment) {
rightMaximum = getMaximum(2 * node + 1, mid + 1, right, leftSegment, rightSegment, sgmTree);
}
return getMaxValue(leftMaximum, rightMaximum);
}
}
void setValue(int node, int left, int right, int pos, int value, int* arr, int *sgmTree) {
if (left == right) {
arr[left] = value;
sgmTree[node] = value;
} else {
int mid = (left + right) / 2;
if (pos <= mid) {
setValue(2 * node, left, mid, pos, value, arr, sgmTree);
} else {
setValue(2 * node + 1, mid + 1, right, pos, value, arr, sgmTree);
}
sgmTree[node] = getMaxValue(sgmTree[2 * node], sgmTree[2 * node + 1]);
}
}
int main() {
f = fopen("arbint.in", "r");
g = fopen("arbint.out", "w");
int n, m;
fscanf(f, "%d %d", &n, &m);
int *arr = (int*) malloc(n * sizeof(int));
int *sgmTree = (int*) malloc(4 * n * sizeof(int));
createSegmentTree(1, 0, n - 1, arr, sgmTree);
int i;
for (i = 0; i < m; ++i) {
int type, a, b;
fscanf(f, "%d %d %d", &type, &a, &b);
if (type == 0) {
a --;
b --;
fprintf(g, "%d\n", getMaximum(1, 0, n - 1, a, b, sgmTree));
} else {
a --;
setValue(1, 0, n - 1, a, b, arr, sgmTree);
}
}
return 0;
}