1 //线段树区间更新
2 //对于单点,线段树维护下更新并将lazy赋值为0
3 //对于区间,加上lazy标记
4 #include <algorithm>
5 #include <cstring>
6 #include <iostream>
7 #define lson rt << 1
8 #define rson rt << 1 | 1
9 using namespace std;
10 using ll = long long;
11 const int mod = 1 << 30;
12 const int maxn = 2e5 + 10;
13 int n, m;
14 template <class T>
15 inline T read(T &ret)
16 {
17 int f = 1;
18 ret = 0;
19 char ch = getchar();
20 while (!isdigit(ch))
21 {
22 if (ch == '-')
23 f = -1;
24 ch = getchar();
25 }
26 while (isdigit(ch))
27 {
28 ret = (ret << 1) + (ret << 3) + ch - '0';
29 ch = getchar();
30 }
31 ret *= f;
32 return ret;
33 }
34 template <class T>
35 inline void write(T n)
36 {
37 if (n < 0)
38 {
39 putchar('-');
40 n = -n;
41 }
42 if (n >= 10)
43 {
44 write(n / 10);
45 }
46 putchar(n % 10 + '0');
47 }
48 struct node
49 {
50 int lazy, val, l, r;
51 } tr[maxn << 2];
52 int a[maxn];
53 void pushdown(int rt)
54 {
55 if (tr[rt].lazy)
56 {
57 tr[lson].val = max(tr[lson].val, tr[rt].lazy);
58 tr[rson].val = max(tr[rson].val, tr[rt].lazy);
59 tr[lson].lazy = max(tr[rt].lazy, tr[lson].lazy);
60 tr[rson].lazy = max(tr[rt].lazy, tr[rson].lazy);
61 tr[rt].lazy = 0;
62 }
63 }
64 void build(int rt, int l, int r)
65 {
66 tr[rt].l = l;
67 tr[rt].r = r;
68 tr[rt].lazy = 0;
69 if (l == r)
70 {
71 read(tr[rt].val);
72 a[l] = tr[rt].val;
73 return;
74 }
75 int mid = l + r >> 1;
76 build(rt << 1, l, mid);
77 build(rt << 1 | 1, mid + 1, r);
78 }
79 void update(int rt, int L, int v)
80 {
81 int l = tr[rt].l;
82 int r = tr[rt].r;
83 if (l == r)
84 {
85 tr[rt].val = v;
86 tr[rt].lazy = 0; //此题单点更新优先级大于懒标记
87 return;
88 }
89 int mid = l + r >> 1;
90 pushdown(rt); //没有返回代表不是完全包含于待查询区间,需要先下放懒标记再向左右区间查询
91 if (L <= mid)
92 update(rt << 1, L, v);
93 else
94 update(rt << 1 | 1, L, v);
95 }
96 void query(int rt, int L, int R)
97 {
98 int l = tr[rt].l;
99 int r = tr[rt].r;
100 if (l == r)
101 {
102 a[l] = max(tr[rt].val, tr[rt].lazy);
103 return;
104 }
105 pushdown(rt); //同update
106 int mid = l + r >> 1;
107 if (L <= mid)
108 query(rt << 1, L, R);
109 if (R > mid)
110 query(rt << 1 | 1, L, R);
111 }
112 int main(int argc, char const *argv[])
113 {
114 read(n);
115 build(1, 1, n);
116 read(m);
117 for (int i = 0; i < m; i++)
118 {
119 int op, x, y;
120 read(op);
121 if (op == 1)
122 {
123 read(x);
124 read(y);
125 update(1, x, y);
126 }
127 else
128 {
129 read(x);
130 tr[1].lazy = max(tr[1].lazy, x);
131 }
132 }
133 query(1, 1, n);
134 for (int i = 1; i <= n; i++)
135 {
136 write(a[i]);
137 putchar(' ');
138 }
139 return 0;
140 }