#include <stdio.h>
#define NMAX 100005
int A[NMAX], IT[2 * NMAX];
int m, n;
inline int min(int a, int b) {
return (a < b ? a : b);
}
inline int max(int a, int b) {
return (a > b ? a : b);
}
int buildIT(int i, int l, int r) {
if (l > r)
return 0;
if (l == r) {
IT[i] = A[l - 1];
return A[l - 1];
}
int m = (l + r) / 2;
return IT[i] = max(buildIT(2 * i, l, m), buildIT(2 * i + 1, m + 1, r));
}
int queryIT(int i, int l, int r, int s, int d) {
if (s == l && d == r)
return IT[i];
int m = (l + r) / 2, vl = 0, vr = 0;
if (l <= s && s <= m)
vl = queryIT(2 * i, l, m, s, min(m , d));
if (m < d && d <= r)
vr = queryIT(2 * i + 1, m + 1, r, max(m + 1, s), d);
return max(vl, vr);
}
int modifyIT(int i, int l, int r, int pos, int key) {
if (l == pos && r == pos) {
IT[i] = key;
return key;
}
int m = (l + r) / 2, vl = IT[2 * i], vr = IT[2 * i + 1];
if (l <= pos && pos <= m)
vl = modifyIT(2 * i, l, m, pos, key);
else
vr = modifyIT(2 * i + 1, m + 1, r, pos, key);
IT[i] = max(vl, vr);
return IT[i];
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
int i;
for (i = 0; i < n; ++ i)
scanf("%d", &A[i]);
buildIT(1, 1, n);
int opt, x, y;
for (i = 0; i < m; ++ i) {
scanf("%d %d %d", &opt, &x, &y);
if (opt == 1)
modifyIT(1, 1, n, x, y);
else
printf("%d\n", queryIT(1, 1, n, x, y));
}
return 0;
}