#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int N;
vector<int> V[100002];
long long A[100002], B[100002];
int posA[100002], posB[100002];
int in[100002], out[100002], whnow;
long long result[100002];
int AIB[100002];

void update(int pos, int val)
{
	for (; pos <= 100000; pos += pos & -pos)
		AIB[pos] += val;
}
int query(int pos)
{
	int sum = 0;
	for (; pos >= 1; pos -= pos & -pos)
		sum += AIB[pos];
	return sum;
}

void Dfs(int x)
{
	in[x] = ++whnow;
	for (auto nod : V[x])
		Dfs(nod);
	out[x] = whnow;
}

inline bool compareA(const int& i1, const int& i2)
{
	return A[i1] < A[i2];
}
inline bool compareB(const int& i1, const int& i2)
{
	return B[i1] < B[i2];
}

int main()
{
	cin.sync_with_stdio(false);
	
	cin >> N;
	for (int i = 2, father; i <= N; ++i)
	{
		cin >> father;
		V[father].push_back(i);
	}
	for (int i = 1; i <= N; ++i)
	{
		cin >> A[i];
		posA[i] = i;
	}
	for (int i = 1; i <= N; ++i)
	{
		cin >> B[i];
		posB[i] = i;
	}
	
	Dfs(1);
	
	sort(posA + 1, posA + N + 1, compareA);
	sort(posB + 1, posB + N + 1, compareB);
	
	int now = 1;
	for (int i = 1; i <= N; ++i)
	{
		while (now <= N && A[posA[now]] <= B[posB[i]])
		{
			update(in[posA[now]], 1);
			++now;
		}
		
		if (A[posB[i]] <= B[posB[i]])
			++result[posB[i]];
		
		int total = 0;
		for (auto nxt : V[posB[i]])
		{
			int sum = query(out[nxt]) - query(in[nxt] - 1);
			total += sum;
			
			if (A[posB[i]] <= B[posB[i]])
				result[posB[i]] += 2 * sum;
		}
		for (auto nxt : V[posB[i]])
		{
			int sum = query(out[nxt]) - query(in[nxt] - 1);
			result[posB[i]] += ((long long) sum) * (total - sum);
		}
	}
	
	for (int i = 1; i <= N; ++i)
		cout << result[i] << '\n';
}