#include <stdio.h>
#include <math.h>
long n, num, i, a[1000000], m, a1, b1, max, choice, poz;
void make(long v1, long v2, long poz) {
if (i >= v1 && i <= v2) {
if (a[poz] < num) {
a[poz] = num;
}
if (v1 == v2)
return;
make(v1, (v1 + v2) / 2, poz * 2);
make((v1 + v2) / 2 + 1, v2, poz * 2 + 1);
}
return;
}
void query(long v1, long v2, long poz) {
if (a1 <= v1 && b1 >= v2) {
if (max < a[poz]) {
max = a[poz];
}
if (v1 == v2) {
return;
}
} else {
if (a1 > v2 || b1 < v1) {
return;
} else {
query(v1, (v1 + v2) / 2, poz * 2);
query((v1 + v2) / 2 + 1, v2, poz * 2 + 1);
}
}
return;
}
long maxim(long val1, long val2) {
if (val1 < val2) {
return val2;
}
return val1;
}
void update(long v1, long v2, long poz) {
if (a1 >= v1 && a1 <= v2) {
if (v1 == v2) {
a[poz] = b1;
return;
}
update(v1, (v1 + v2) / 2, poz * 2);
update((v1 + v2) / 2 + 1, v2, poz * 2 + 1);
a[poz] = maxim(a[poz * 2], a[poz * 2 + 1]);
} else {
return;
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%ld %ld", &n, &m);
for (i = 1; i <= n; ++i) {
scanf("%ld", &num);
make(1, n, 1);
}
for (i = 1; i <= m; ++i) {
scanf("%ld %ld %ld", &choice, &a1, &b1);
if (choice == 0) {
max = 0;
query(1, n, 1);
printf("%ld\n", max);
} else {
update(1, n, 1);
}
}
return 0;
}