#include <stdio.h>
#define MAX(a, b) ((a) > (b)) ? (a) : (b)
long v[200005];
void update (int l, int r, int pos, int x, int i) {
if (pos <= l && pos >= r) {
v[i] = x;
return;
} else {
int mid = (l + r) / 2;
if (pos <= mid) update(l, mid, pos, x, 2*i);
if (pos > mid) update(mid+1, r, pos, x, 2*i+1);
v[i] = MAX(v[2*i], v[2*i+1]);
}
}
long query (int l, int r, int a, int b, int i) {
if (a <= l && b >= r) {
return v[i];
} else {
int mid = (l + r) / 2;
long m1 = 0, m2 = 0;
if (a <= mid) m1 = query(l, mid, a, b, 2*i);
if (b > mid) m2 = query(mid+1, r, a, b, 2*i+1);
return MAX(m1, m2);
}
}
int main (void) {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int m, n;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
update(1, n, i, x, 1);
}
/*for (int i = 1; i <= 2*n; ++i) {
printf("%ld ", v[i]);
}
printf("\n");
*/
for (int i = 0; i < m; ++i) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (a) {
update(1, n, b, c, 1);
} else {
long r = query(1, n, b, c, 1);
printf("%ld\n", r);
}
}
return 0;
}