# include <cstring>
# include <cstdio>
const char *FIN = "arbint.in", *FOU = "arbint.out";
int ai[400105];
int N, M;
inline int max (int a, int b) {
return (a > b ? a : b);
}
void update (int nod, int st, int dr, int poz, int val) {
if (st == dr) {
ai[nod] = val;
return ;
}
int mij = st + dr >> 1;
if (poz <= mij)
update (nod << 1, st, mij, poz, val);
else
update ((nod << 1) + 1, mij + 1, dr, poz, val);
ai[nod] = max (ai[nod << 1], ai[(nod << 1) + 1]);
}
int query (int nod, int st, int dr, int s1, int s2) {
if (s1 <= st && dr <= s2) {
return max (0, ai[nod]);
}
int mij = st + dr >> 1;
return max (s1 <= mij ? query (nod << 1, st, mij, s1, s2) : 0, mij < s2 ? query ((nod << 1) + 1, mij + 1, dr, s1, s2) : 0);
}
int main (void) {
freopen (FIN, "r", stdin);
freopen (FOU, "w", stdout);
scanf ("%d %d", &N, &M);
for (int i = 1, x; i <= N; ++i) {
scanf ("%d", &x);
update (1, 1, N, i, x);
}
for (int i = 1, tip, x, y; i <= M; ++i) {
scanf ("%d %d %d", &tip, &x, &y);
if (tip) {
update (1, 1, N, x, y);
} else {
printf ("%d\n", query (1, 1, N, x, y));
}
}
}