```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n int
fmt.Fscan(reader, &n)
children := make([][]int, n+1)
for i := 2; i <= n; i++ {
var p int
fmt.Fscan(reader, &p)
children[p] = append(children[p], i)
}
a := make([]int64, n+1)
for i := 1; i <= n; i++ {
fmt.Fscan(reader, &a[i])
}
subtreeSum := make([]int64, n+1)
numLeaves := make([]int64, n+1)
for i := 1; i <= n; i++ {
if len(children[i]) == 0 {
numLeaves[i] = 1
}
}
// Compute subtreeSum and numLeaves bottom-up
for i := 1; i <= n; i++ {
subtreeSum[i] = a[i]
}
for i := n; i >= 1; i-- {
for _, c := range children[i] {
subtreeSum[i] += subtreeSum[c]
numLeaves[i] += numLeaves[c]
}
}
var ans int64
for i := 1; i <= n; i++ {
L := numLeaves[i]
S := subtreeSum[i]
if L > 0 {
val := (S + L - 1) / L
if val > ans {
ans = val
}
}
}
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
fmt.Fprintln(writer, ans)
}
```