import
java.util.*;
class
DifferenceTree {
static
long
fun(
int
i, List<Long> ans, List<Integer>[] adj, List<Integer> val) {
long
mx = Long.MIN_VALUE, mn = Long.MAX_VALUE;
long
total =
0
;
for
(
int
it : adj[i]) {
long
find = fun(it, ans, adj, val);
mx = Math.max(mx, find);
mn = Math.min(mn, find);
total += find;
}
if
(mx != Long.MIN_VALUE) {
ans.set(i -
1
, mx - mn);
}
return
total + val.get(i -
1
);
}
static
List<Long> differenceTree(
int
n, List<Integer> par, List<Integer> vals) {
List<Integer>[] adj =
new
ArrayList[n +
1
];
for
(
int
i =
0
; i <= n; i++) {
adj[i] =
new
ArrayList<>();
}
for
(
int
i =
1
; i < n; i++) {
adj[par.get(i)].add(i +
1
);
}
List<Long> ans =
new
ArrayList<>(Collections.nCopies(n, 0L));
fun(
1
, ans, adj, vals);
return
ans;
}
public
static
void
main(String[] args) {
int
N =
6
;
List<Integer> pals = Arrays.asList(-
1
,
1
,
1
,
2
,
2
,
4
);
List<Integer> vals = Arrays.asList(
2
,
1
,
4
,
6
,
2
,
5
);
List<Long> ans = differenceTree(N, pals, vals);
for
(
long
a : ans) {
System.out.print(a +
" "
);
}
}
}