import
java.util.*;
class
Main
{
static
HashMap<Integer, Float> ans =
new
HashMap<>();
static
TreeSet<Integer> s =
new
TreeSet<>();
static
TreeSet<Integer> g =
new
TreeSet<>();
static
void
addEdge(ArrayList<ArrayList<Integer>> adj,
int
u,
int
v) {
adj.get(u).add(v);
adj.get(v).add(u);
}
static
void
helper(
int
v) {
s.add(v);
int
temp = s.last();
s.remove(temp);
g.add(temp);
if
(g.size() > s.size()) {
temp = g.first();
g.remove(temp);
s.add(temp);
}
}
static
void
MedianOfAncestors(ArrayList<ArrayList<Integer>> adj,
int
node, ArrayList<Integer> vis, ArrayList<Integer> val) {
int
v = val.get(node);
vis.set(node,
1
);
helper(v);
if
(g.size() != s.size())
ans.put(node, (
float
) s.last());
else
ans.put(node, ((
float
) s.last() + (
float
) g.first()) /
2
);
for
(
int
child : adj.get(node)) {
if
(vis.get(child) ==
0
)
MedianOfAncestors(adj, child, vis, val);
}
if
(s.contains(v))
s.remove(v);
else
g.remove(v);
}
public
static
void
main(String[] args) {
int
N =
9
;
ArrayList<ArrayList<Integer>> adj =
new
ArrayList<>();
for
(
int
i =
0
; i < N; i++)
adj.add(
new
ArrayList<>());
addEdge(adj,
0
,
1
);
addEdge(adj,
0
,
2
);
addEdge(adj,
1
,
3
);
addEdge(adj,
1
,
4
);
addEdge(adj,
1
,
5
);
addEdge(adj,
2
,
6
);
addEdge(adj,
2
,
7
);
addEdge(adj,
2
,
8
);
ArrayList<Integer> val =
new
ArrayList<>(Arrays.asList(
3
,
4
,
2
,
3
,
6
,
2
,
10
,
8
,
1
));
ArrayList<Integer> vis =
new
ArrayList<>(Collections.nCopies(N,
0
));
MedianOfAncestors(adj,
0
, vis, val);
for
(
int
i =
0
; i < N; i++)
System.out.print(ans.get(i) +
" "
);
System.out.println();
}
}