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)
}