#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

typedef long long ll;

class FenwickTree {
private:
    vector<int> tree;
public:
    FenwickTree(int size) : tree(size + 2, 0) {} // 多开2防止越界
    
    void update(int idx, int delta) {
        while (idx < tree.size()) {
            tree[idx] += delta;
            idx += idx & -idx;
        }
    }
    
    int query(int idx) {
        int res = 0;
        while (idx > 0) {
            res += tree[idx];
            idx -= idx & -idx;
        }
        return res;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;
    
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    
    vector<int> father(n + 1);
    vector<vector<int>> children(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> father[i];
        if (i != 1) {
            children[father[i]].push_back(i);
        }
    }
    
    // 1. 后序计算sum_sub和down
    vector<ll> sum_sub(n + 1), down(n + 1);
    function<void(int)> dfs1 = [&](int u) {
        sum_sub[u] = a[u];
        for (int v : children[u]) {
            dfs1(v);
            sum_sub[u] += sum_sub[v];
        }
        down[u] = sum_sub[u] - a[u];
    };
    dfs1(1);
    
    // 2. 先序计算up
    vector<ll> up(n + 1, 0);
    function<void(int)> dfs2 = [&](int u) {
        for (int v : children[u]) {
            up[v] = up[u] + a[u];
            dfs2(v);
        }
    };
    dfs2(1);
    
    // 3. 计算is_support和sub_support
    vector<bool> is_support(n + 1);
    vector<int> sub_support(n + 1);
    function<void(int)> dfs3 = [&](int u) {
        is_support[u] = (up[u] >= a[u]) && (down[u] <= a[u]);
        sub_support[u] = is_support[u];
        for (int v : children[u]) {
            dfs3(v);
            sub_support[u] += sub_support[v];
        }
    };
    dfs3(1);
    int total = sub_support[1];
    
    // 4. 离散化所有需要的值(修正部分)
    vector<ll> all_values;
    for (int x = 1; x <= n; x++) {
        if (up[x] >= a[x] && down[x] > a[x]) {
            all_values.push_back(down[x] - a[x]); // 存down[x]-a[x]
        }
    }
    for (int v = 1; v <= n; v++) {
        all_values.push_back(sum_sub[v]); // 存sum_sub[v]
    }
    sort(all_values.begin(), all_values.end());
    all_values.erase(unique(all_values.begin(), all_values.end()), all_values.end());
    
    auto get_id = [&](ll x) {
        return lower_bound(all_values.begin(), all_values.end(), x) - all_values.begin() + 1;
    };
    
    // 5. DFS计算delta数组(修正部分)
    FenwickTree ft(all_values.size());
    vector<int> delta(n + 1, 0);
    
    function<void(int)> dfs4 = [&](int u) {
        // 先算delta[u](此时树状数组只有u的真祖先)
        ll K = sum_sub[u]; // 只需要sum_sub[u]
        int id = get_id(K);
        delta[u] = ft.query(id);
        
        // 再把u加入树状数组(供它的孩子使用)
        if (up[u] >= a[u] && down[u] > a[u]) {
            ft.update(get_id(down[u] - a[u]), 1); // 存down[u]-a[u]
        }
        
        // 递归访问孩子
        for (int v : children[u]) {
            dfs4(v);
        }
        
        // 回溯时删除u
        if (up[u] >= a[u] && down[u] > a[u]) {
            ft.update(get_id(down[u] - a[u]), -1);
        }
    };
    dfs4(1);
    
    // 6. 计算最大值
    int ans = total; // 不删除任何边的情况
    for (int v = 1; v <= n; v++) {
        ans = max(ans, total - sub_support[v] + delta[v]);
    }
    
    cout << ans << endl;
    return 0;
}