#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100002;
int rangeTree[4 * NMAX];
int V[NMAX];
void rangeTreeBuild (const int left, const int right, const int node) {
if (left == right) {
rangeTree[node] = V[left];
return;
}
int middle = left + right >> 1;
rangeTreeBuild (left, middle, node * 2);
rangeTreeBuild (middle + 1, right, node * 2 + 1);
rangeTree[node] = max (
rangeTree[node * 2],
rangeTree[node * 2 + 1]
);
}
int updateValue, updateIndex;
void rangeTreeUpdate (const int left, const int right, const int node) {
if (left == right) {
rangeTree[node] = updateValue;
return;
}
int middle = left + right >> 1;
if (updateIndex <= middle)
rangeTreeUpdate (left, middle, node * 2);
else
rangeTreeUpdate (middle + 1, right, node * 2 + 1);
rangeTree[node] = max (rangeTree[node * 2], rangeTree[node * 2 + 1]);
}
int queriedLeft, queriedRight;
int rangeTreeQuery (const int left, const int right, const int node) {
if (left > queriedRight || right < queriedLeft)
return 0;
if (left >= queriedLeft && right <= queriedRight)
return rangeTree[node];
int middle = left + right >> 1;
return max (
rangeTreeQuery (left, middle, node * 2),
rangeTreeQuery (middle + 1, right, node * 2 + 1)
);
}
int main () {
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
int N, M;
scanf ("%d%d", &N, &M);
for (int i = 1; i <= N; ++i) {
scanf ("%d", V + i);
}
rangeTreeBuild (1, N, 1);
while (M--) {
int operation, a, b;
scanf ("%d%d%d", &operation, &a, &b);
switch (operation) {
case 0:
queriedLeft = a;
queriedRight = b;
printf ("%d\n", rangeTreeQuery(1, N, 1));
break;
case 1:
updateIndex = a;
updateValue = b;
rangeTreeUpdate (1, N, 1);
break;
}
}
}