#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int NMAX = 100000;
int t[4 * NMAX];
void build(int a[], int v, int tl, int tr) {
if (tl == tr) {
t[v] = a[tl];
} else {
int tm = (tl + tr) / 2;
build(a, v * 2, tl, tm);
build(a, v * 2 + 1, tm + 1, tr);
t[v] = max(t[v * 2], t[v * 2 + 1]);
}
}
int maxArb(int v, int tl, int tr, int l, int r) {
if (l > r)
return 0;
if (l == tl && r == tr) {
return t[v];
}
int tm = (tl + tr) / 2;
return max(maxArb(v * 2, tl, tm, l, min(r, tm)), maxArb(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r));
}
void update(int v, int tl, int tr, int pos, int new_val) {
if (tl == tr) {
t[v] = new_val;
} else {
int tm = (tl + tr) / 2;
if (pos <= tm)
update(v * 2, tl, tm, pos, new_val);
else
update(v * 2 + 1, tm + 1, tr, pos, new_val);
t[v] = max(t[v * 2], t[v * 2 + 1]);
}
}
int main() {
int N, M;
f >> N >> M;
int A[N];
for (int i = 1; i <= N; i++) {
f >> A[i];
}
build(A, 1, 1, N);
for (int i = 0; i <= 2 * N; i++) {
cout << t[i] << " ";
}
for (int i = 0; i < M; i++) {
int op, a, b;
f >> op >> a >> b;
if (op == 0) {
g << maxArb(1, 1, N, a, b) << "\n";
} else {
update(1, 1, N, a, b);
}
}
f.close();
g.close();
}
// 4 3 5 6 1
// 6 [1,5]
// 5 6
// 4 5 6 1
// 4 3