1+ /* *
2+ * @file 10867.cpp
3+ * @author Macesuted (i@macesuted.moe)
4+ * @date 2025-10-10
5+ *
6+ * @copyright Copyright (c) 2025
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #define endl ' \n '
14+
15+ #define maxn 250005
16+
17+ class SegmentTree {
18+ private:
19+ int a[maxn << 2 ], n;
20+
21+ void pushDown (int p) {
22+ if (!a[p]) return ;
23+ a[p << 1 ] = max (a[p << 1 ], a[p]), a[p << 1 | 1 ] = max (a[p << 1 | 1 ], a[p]);
24+ a[p] = 0 ;
25+ return ;
26+ }
27+ void insert (int p, int l, int r, int qp) {
28+ if (l == r) return a[p] = 0 , void ();
29+ pushDown (p);
30+ int mid = (l + r) >> 1 ;
31+ return qp <= mid ? insert (p << 1 , l, mid, qp) : insert (p << 1 | 1 , mid + 1 , r, qp);
32+ }
33+ int erase (int p, int l, int r, int qp) {
34+ if (l == r) return a[p];
35+ pushDown (p);
36+ int mid = (l + r) >> 1 ;
37+ return qp <= mid ? erase (p << 1 , l, mid, qp) : erase (p << 1 | 1 , mid + 1 , r, qp);
38+ }
39+ void update (int p, int l, int r, int ql, int qr, int v) {
40+ if (ql <= l && r <= qr) return a[p] = max (a[p], v), void ();
41+ pushDown (p);
42+ int mid = (l + r) >> 1 ;
43+ if (ql <= mid) update (p << 1 , l, mid, ql, qr, v);
44+ if (qr > mid) update (p << 1 | 1 , mid + 1 , r, ql, qr, v);
45+ return ;
46+ }
47+
48+ public:
49+ void resize (int _n) { return n = _n, void (); }
50+ void insert (int p) { return insert (1 , 1 , n, p); }
51+ int erase (int p) { return erase (1 , 1 , n, p); }
52+ void update (int l, int r, int v) { return update (1 , 1 , n, l, r, v); }
53+ } SGT;
54+
55+ int a[maxn], dep[maxn], fa[maxn], son[maxn], top[maxn], siz[maxn], dfni[maxn], ans[maxn];
56+ vector<int > t1[maxn], t2[maxn];
57+
58+ void dfs1 (int p, int pre = 0 ) {
59+ siz[p] = 1 , fa[p] = pre ;
60+ for (auto q : t2[p])
61+ if (q != pre ) {
62+ dep[q] = dep[p] + 1 , dfs1 (q, p), siz[p] += siz[q];
63+ if (!son[p] || siz[q] > siz[son[p]]) son[p] = q;
64+ }
65+ return ;
66+ }
67+ int dfnt = 0 ;
68+ void dfs2 (int p, int t) {
69+ dfni[p] = ++dfnt, top[p] = t;
70+ if (son[p]) dfs2 (son[p], t);
71+ for (auto q : t2[p])
72+ if (q != son[p] && q != fa[p]) dfs2 (q, q);
73+ return ;
74+ }
75+ void dfs3 (int p, int pre = 0 ) {
76+ SGT.insert (dfni[p]);
77+
78+ int x = p;
79+ while (top[x] != 1 ) SGT.update (dfni[top[x]], dfni[x], a[p]), x = fa[top[x]];
80+ SGT.update (1 , dfni[x], a[p]);
81+
82+ for (auto q : t1[p])
83+ if (q != pre ) dfs3 (q, p);
84+
85+ ans[p] = SGT.erase (dfni[p]);
86+
87+ return ;
88+ }
89+
90+ void solve (void ) {
91+ int n;
92+ cin >> n;
93+ for (int i = 1 ; i <= n; i++) cin >> a[i];
94+ for (int i = 1 , x, y; i < n; i++) cin >> x >> y, t1[x].push_back (y), t1[y].push_back (x);
95+ for (int i = 1 , x, y; i < n; i++) cin >> x >> y, t2[x].push_back (y), t2[y].push_back (x);
96+
97+ dfs1 (1 );
98+ dfs2 (1 , 1 );
99+
100+ SGT.resize (n);
101+
102+ dfs3 (1 );
103+
104+ for (int i = 1 ; i <= n; i++) cout << ans[i] << endl;
105+
106+ return ;
107+ }
108+
109+ int main () {
110+ ios::sync_with_stdio (false ), cin.tie (nullptr );
111+
112+ int _ = 1 ;
113+ while (_--) solve ();
114+
115+ return 0 ;
116+ }
0 commit comments