#include <bits/stdc++.h>
using namespace std;
#define MAXN 100003
vector<vector<int> > v;
int n;
int val[MAXN];
long long big_val[MAXN];
int l[MAXN];
int r[MAXN];
int bit[MAXN];
int res[MAXN];
int p = 0;

void update(int x, int delta){
    while(x<=n){
        bit[x] += delta;
        x+= x&-x;
    }
}
int query(int x){
    int sum = 0;
    while(x>0){
        sum+=bit[x];
        x-= x&-x;
    }
    return sum;
}
int query(int b, int e){
    if(b>e) return 0;
    return query(e) - query(b-1);
}

void dfs(int x){
    l[x] = ++p;
    for(int i=0; i<v[x].size();++i){
        dfs(v[x][i]);
    }
    r[x] = p;
}

int main() {
  //  freopen("C:\\in.txt", "r", stdin);
    scanf("%d", &n);
    v.assign(n+1, vector<int>());
    for(int i=2; i<=n; ++i){
        int x;
        scanf("%d", &x);
        v[x].push_back(i);
    }
    vector<pair<pair<int,bool>, int > > pairs;
    for(int i=1; i<=n; ++i){
        scanf("%d", &val[i]);
        pairs.push_back(make_pair(make_pair(val[i], false), i));
    }
    for(int i=1; i<=n; ++i){
        scanf("%lld", &big_val[i]);
        pairs.push_back(make_pair(make_pair(big_val[i], true), i));
    }
    dfs(1);
    sort(pairs.begin(), pairs.end());

    for(int i=0; i<pairs.size(); ++i){
        pair< pair<int,bool>, int > curr = pairs[i];
        bool is_big_val = curr.first.second;
        int curr_node = curr.second;
        if(is_big_val){
            int sum = query(l[curr_node]+1, r[curr_node]);
            int curr_res = val[curr_node] <= big_val[curr_node]?curr_res = 2*sum+1:0;
            for(int i=0; i<v[curr_node].size(); ++i){
                int curr_subtree_sum = query(l[v[curr_node][i]], r[v[curr_node][i]]);
                curr_res += curr_subtree_sum * (sum-curr_subtree_sum);
            }
            res[curr_node] = curr_res;

        } else {
            update(l[curr_node], 1);
        }
    }
    for(int i=1; i<=n; ++i){
        printf("%d\n", res[i]);
    }


    return 0;
}