#include <algorithm>
#include <cstdio>
const int MAX_N = 100000;
int tree[2 + 4 * MAX_N];
int a[2 + MAX_N];
void update(int nod, int left, int right, int pos, int value) {
if (left == right) {
tree[nod] = value;
return;
}
int mid = (left + right) / 2;
if (pos <= mid)
update(2 * nod, left, mid, pos, value);
else
update(2 * nod + 1, mid + 1, right, pos, value);
tree[nod] = std::max(tree[2 * nod], tree[2 * nod + 1]);
}
int query(int nod, int left, int right, int leftQ, int rightQ) {
if (left == leftQ && rightQ == right)
return tree[nod];
int mid = (left + right) / 2;
if (rightQ <= mid)
return query(2 * nod, left, mid, leftQ, rightQ);
else if (mid < leftQ)
return query(2 * nod + 1, mid + 1, right, leftQ, rightQ);
return std::max(query(2 * nod, left, mid, leftQ, mid), query(2 * nod + 1, mid + 1, right, mid + 1, rightQ));
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, q;
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
update(1, 1, n, i, a[i]);
}
for (int i = 1; i <= q; i++) {
int type, a, b;
scanf("%d%d%d", &type, &a, &b);
if (type == 1)
update(1, 1, n, a, b);
else
printf("%d\n", query(1, 1, n, a, b));
}
return 0;
}