import
java.util.ArrayList;
import
java.util.Arrays;
public
class
GFG {
static
ArrayList<
int
[]> edges =
new
ArrayList<
int
[]>();
static
void
add_edge(
int
x,
int
y)
{
edges.add(
new
int
[] { x, y });
}
static
ArrayList<Integer> merge(ArrayList<Integer> a,
ArrayList<Integer> b)
{
ArrayList<Integer> res =
new
ArrayList<Integer>();
int
i =
0
, j =
0
;
int
n = a.size(), m = b.size();
while
(i < n && j < m) {
if
(a.get(i) < b.get(j))
res.add(a.get(i++));
else
if
(b.get(j) < a.get(i))
res.add(b.get(j++));
}
while
(i < n)
res.add(a.get(i++));
while
(j < m)
res.add(b.get(j++));
return
res;
}
static
ArrayList<Integer>
help(ArrayList<Integer>[] tree,
int
x,
int
p,
int
[] c,
int
[] sol)
{
ArrayList<Integer> res =
new
ArrayList<Integer>();
res.add(c[x]);
for
(
int
i : tree[x]) {
if
(i != p) {
ArrayList<Integer> tmp
= help(tree, i, x, c, sol);
res = merge(res, tmp);
}
}
int
l =
0
, r = res.size() -
1
;
int
ans = res.size();
while
(l <= r) {
int
mid = (l + r) /
2
;
if
(res.get(mid) > mid)
r = mid -
1
;
else
{
ans = mid +
1
;
l = mid +
1
;
}
}
if
(res.get(
0
) !=
0
)
ans =
0
;
sol[x] = ans;
return
res;
}
@SuppressWarnings
(
"unchecked"
)
static
void
solve(
int
A,
int
[] C)
{
int
n = A;
ArrayList<Integer>[] tree =
new
ArrayList[n +
1
];
for
(
int
i =
0
; i <= n; i++)
tree[i] =
new
ArrayList<Integer>();
for
(
int
[] i : edges) {
tree[i[
0
]].add(i[
1
]);
tree[i[
1
]].add(i[
0
]);
}
int
[] sol =
new
int
[n];
help(tree,
0
, -
1
, C, sol);
for
(
int
i : sol)
System.out.print(i +
" "
);
}
public
static
void
main(String[] args)
{
int
N =
6
;
add_edge(
0
,
1
);
add_edge(
1
,
2
);
add_edge(
0
,
3
);
add_edge(
3
,
4
);
add_edge(
3
,
5
);
int
[] val = {
4
,
3
,
5
,
1
,
0
,
2
};
solve(N, val);
}
}