#include <climits>
#include <iostream>
#include <vector>
using namespace std;
// 以 root 为终点的最长路径
int dfs(int root, vector<int>& nums, vector<vector<int>>& children, int& res) {
// 最长路,次长路
int len1 = 0, len2 = 0;
for (int child : children[root]) {
int x = dfs(child, nums, children, res);
if (x > len1) {
len2 = len1;
len1 = x;
} else if (x > len2) {
len2 = x;
}
}
res = max(res, nums[root] + max(len1, 0) + max(len2, 0));
return len1 + nums[root];
}
int main() {
int n; cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
vector<vector<int>> children(n);
for (int i = 0; i < n; i++) {
int x; cin >> x;
if (x > 0) {
children[x - 1].push_back(i);
}
}
int res = INT_MIN;
dfs(0, nums, children, res);
cout << res << endl;
return 0;
}
// 64 位输出请用 printf("%lld")