#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; }