package main import ( "bufio" "fmt" "os" ) const MIN = -1000000000 var in = bufio.NewReader(os.Stdin) var out = bufio.NewWriter(os.Stdout) func readInt(a *int) error { sign, ans, read := 1, 0, false c, err := in.ReadByte() for ; err == nil && (c < '0' || c > '9'); c, err = in.ReadByte() { if c == '-' { sign = -1 } } for ; err == nil && c >= '0' && c <= '9'; c, err = in.ReadByte() { ans = ans *10 + int(c-'0') read = true } if read { *a = ans * sign return nil } return err } func max(a, b int) int { if a< b { return b } return a } func main() { defer out.Flush() var n int readInt(&n) var cost = make([]int, n+1) var edge = make([][]int, n+1) for i := 1; i <= n; i++ { readInt(&cost[i]) } root := 0 for i := 1; i <= n; i++ { var cur int readInt(&cur) if cur == 0 { root = i } else { edge[cur] = append(edge[cur], i) } } ans := MIN var dfs func(cur, fa int) int dfs = func(cur, fa int) int{ ans = max(ans, cost[cur]) var left, right int= MIN, MIN var i int = 0 for _, item := range edge[cur] { if item == fa { continue } if i == 0 { left = dfs(item, cur) } else { right = dfs(item, cur) } i++ } ans = max(ans, cost[cur]+max(left+right, max(left, right))) return max(cost[cur], cost[cur]+max(left, right)) } dfs(root, -1) fmt.Fprintln(out, ans) }