#include <bits/stdc++.h>

using namespace std;

#define MAXN 100050

int N;
int x;
vector<int> A[MAXN];
long long val[MAXN];
long long qval[MAXN];
vector<pair<pair<long long, int>, int> > Eval, Eqval;
int S[MAXN];
int T[MAXN];
int K;
vector<long long> Sv;
int aib[2 * MAXN];
int lvl[MAXN];
long long ans[MAXN];

void dfs(int node, int prv) {
	lvl[node] = prv == -1 ? 0 : lvl[prv] + 1;
	S[node] = K++;
	for (int x : A[node]) {
		dfs(x, node);
	}
	T[node] = K++;
}

int query(int pos) {
	pos++;
	int ret = 0;
	while (pos > 0) {
		ret += aib[pos];
		pos -= pos & (-pos);
	}
	return ret;
}

int query(int a, int b) {
	return query(b) - query(a - 1);
}

void update(int pos, int val) {
	pos++;
	while (pos <= 2 * N) {
		aib[pos] += val;
		pos += pos & (-pos);
	}
}

int main() {
//	freopen("date.in", "r", stdin);
//	freopen("date.out","w", stdout);
	
	scanf("%d", &N);
	for (int i = 1; i < N; i++) {
		scanf("%d", &x);
		x--;
		A[x].push_back(i);
	}
	
	dfs(0, -1);
	for (int i = 0; i < N; i++) {
		scanf("%lld", &val[i]);
		Eval.push_back({{val[i], N - lvl[i]}, i});
		Sv.push_back(val[i]);
	}
	for (int i = 0; i < N; i++) {
		scanf("%lld", &qval[i]);
		Eqval.push_back({{qval[i], N - lvl[i]}, i});
		Sv.push_back(qval[i]);
	}
	
	sort(Sv.begin(), Sv.end());
	Sv.resize(unique(Sv.begin(), Sv.end()) - Sv.begin());
	sort(Eval.begin(), Eval.end());
	sort(Eqval.begin(), Eqval.end());
	
	int i = 0; // eval
	int j = 0; // eqval
	for (int x : Sv) {
		while (i < (int) Eval.size() && Eval[i].first.first <= x) {
			int node = Eval[i].second;
			update(S[node], 1);
			i++;
		}
		while (j < (int) Eqval.size() && Eqval[j].first.first <= x) {
			int sum = 0;
			int node = Eqval[j].second;
			if (val[node] <= qval[node]) {
				sum++;
				ans[node]++;
			}
			for (int y : A[node]) {
				int q = query(S[y], T[y]);
				ans[node] += (long long) q * sum * 2;
				sum += q;
			}
			j++;
		}
	}
	
	for (int i = 0;	i < N; i++) {
		printf("%lld\n", ans[i]);
	}
	
	return 0;
}