# include <cstdio>
# include <algorithm>
using namespace std;
FILE *fin = fopen("arbint.in", "rt");
FILE *fout = fopen("arbint.out", "wt");
const int MAXN = 100005;
int Arb[4*MAXN];
int n, m, tmp, x, y;
void update(int nod, int st, int dr, int i, int j) {
if (st >= i && dr <= i)
Arb[nod] = j;
else {
int mid = st + (dr-st)/2,
f1 = (nod << 1),
f2 = f1 + 1;
if (i <= mid)
update(f1, st, mid, i, j);
else
update(f2, mid+1, dr, i, j);
Arb[nod] = max(Arb[f1], Arb[f2]);
}
}
int query(int nod, int st, int dr, int i, int j) {
if (i <= st && j >= dr)
return Arb[nod];
int mid, p1, p2, f1, f2;
mid = st + (dr-st)/2;
f1 = (nod << 1);
f2 = f1 + 1;
p1 = p2 = 0;
if (i <= mid)
p1 = query(f1, st, mid, i, j);
else
p2 = query(f2, mid+1, dr, i, j);
return max(p1, p2);
}
int main() {
fscanf(fin, "%d%d", &n, &m);
for (int i=1; i<=n; ++i) {
fscanf(fin, "%d", &x);
update(1, 1, n, i, x);
}
for (int i=1; i<=n; ++i) {
fscanf(fin, "%d%d%d", &tmp, &x, &y);
if (tmp == 0)
fprintf(fout, "%d\n", query(1, 1, n, x, y));
else
update(1, 1, n, x, y);
}
return 0;
}