#include <cstdio>
#define max(a, b) ((a > b) ? a : b)
int n, m, c, x, y, i, v[100000], arbint[262144], maxim;
void update(int x, int y, int st, int dr, int pos) {
if(st == dr)
arbint[pos] = y;
else {
int m = (st+dr) >> 1;
if(x <= m)
update(x, y, st, m, pos << 1);
else
update(x, y, m+1, dr,(pos << 1) + 1);
arbint[pos] = max(arbint[pos << 1], arbint[(pos << 1) + 1]);
}
}
void query(int x, int y, int st, int dr, int pos) {
if(x <= st && dr <= y)
maxim = max(maxim, arbint[pos]);
else {
int m = (st + dr) >> 1;
if(x <= m)
query(x, y, st, m, pos << 1);
else
query(x, y, m+1, dr, (pos << 1) + 1);
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 1; i <= n; ++i) {
scanf("%d", &y);
update(i, y, 1, n, 1);
}
for(i = 1; i <= m; ++i) {
scanf("%d%d%d", &c, &x, &y);
if(c == 0) {
maxim = -1;
query(x, y, 1, n, 1);
printf("%d\n", maxim);
}
else
update(x, y, 1, n, 1);
}
}