#include <iostream>
#include<vector>
using namespace std;
using i64 =long long;
const int N =1e5+10;

i64 res =-1e9 ;

i64 dfs(int  root,vector<int> & val,vector<vector<int>>&tree)
{
    
    
    if(tree[root].size()==0)
    {
        res =max(res,1LL*val[root]);
        return val[root];
    }
    res =max(res ,1LL*val[root]);
    i64 mx =val[root];

    i64 x1 =-1e9,x2 =0;
    i64 sum =0;
    for(auto & node: tree[root])
    {
        i64 t =dfs(node,val,tree);
        x1= max(x1,t);
        sum+=t;
    }
    x2 = sum -x1;

    if(x1>0)mx+=x1;
    if(x2>0)mx+=x2;

    res =max(res,mx);
    //  cout<<res<<endl;
    return max(x1+val[root],1LL*val[root]);
}

int main() {
    int n ;
    cin>>n;
    vector<int> val(n+1);
    vector<vector<int>> tree(n+1);
    for(int i=1;i<=n;i++)cin>>val[i];
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        if(!x)continue;
        tree[x].push_back(i);
    }
    dfs(1,val,tree);
    cout<<res;
}
// 64 位输出请用 printf("%lld")