#include <bits/stdc++.h>
using namespace std;
struct segTree {
int key;
segTree *left, *right;
segTree() {
left = NULL;
right = NULL;
key = 0;
}
};
segTree *Root;
int s;
void updateKey(segTree* &node, int left, int right, int indx, int key) {
if (node == NULL) {
node = new segTree;
}
if (left != right) {
int mid = (left + right) / 2;
if (indx <= mid) {
updateKey(node->left, left, mid, indx, key);
} else {
updateKey(node->right, mid + 1, right, indx, key);
}
node->key = 0;
if (node->left != NULL) {
node->key = node->left->key;
}
if (node->right != NULL) {
node->key = max(node->key, node->right->key);
}
} else {
node->key = key;
}
}
void query(segTree* node, int left, int right, int st, int fn) {
if (left > fn || right < st || node == NULL) {
return;
}
if (st <= left && right <= fn) {
s = max(s, node->key);
}
int mid = (left + right) / 2;
if (st <= mid) {
query(node->left, left, mid, st, fn);
}
if (fn > mid) {
query(node->right, mid + 1, right, st, fn);
}
}
int main(void) {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int N, M;
scanf("%d%d", &N, &M);
for (int i = 0; i < N; i++) {
int x;
scanf("%d", &x);
updateKey(Root, 0, N - 1, i, x);
}
while (M--) {
int opType;
scanf("%d", &opType);
if (!opType) {
int st, fn;
scanf("%d%d", &st, &fn);
s = 0;
query(Root, 0, N - 1, st - 1, fn - 1);
printf("%d\n", s);
} else {
int poz, key;
scanf("%d%d", &poz, &key);
updateKey(Root, 0, N - 1, poz - 1, key);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}