#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
//ifstream fin("date.in");
//ofstream fout("date.out");
#define MAX 100010
typedef vector<int> :: iterator iter;
vector<int> G[MAX];

struct str{
    int ind, tip;
    long long val;
} x[2 * MAX];

str make_str(int i, long long v, int t)
{
    str se;
    se.ind = i;
    se.val = v;
    se.tip = t;
    return se;
}

inline bool cmp(str a, str b)
{
    if(a.val == b.val)
    {
        return a.tip < b.tip;
    }
    return a.val < b.val;
}

int dad[MAX];
long long a[MAX], b[MAX];
int poz[MAX], dr2, nr_fii[MAX], n, AIB[MAX], g[MAX];
long long r[MAX];
void df(int nod)
{
    ++dr2;
  //  st[dr2] = nod;
    poz[nod] = dr2;
    nr_fii[nod] = 1;
    for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
    {
        df(*it);
        nr_fii[nod] += nr_fii[*it];
    }
}

void update(int p)
{
    while(p <= n)
    {
        AIB[p]++;
        p += (p & (-p));
    }
}

int sum(int p)
{
    int s = 0;
    while(p)
    {
        s += AIB[p];
        p -= (p & (-p));
    }
    return s;
}

int main()
{
    int i, dr = 0, nod;
    long long y;
    cin >> n;
    for(i = 2; i <= n ; i++)
    {
        cin >> dad[i];
        G[dad[i]].push_back(i);
    }
    for(i = 1 ; i <= n ; i++)
    {
        cin >> y;
        a[i] = y;
        x[++dr] = make_str(i, y, 0);
    }
    for(i = 1 ; i <= n ; i++)
    {
        cin >> y;
        b[i] = y;
        x[++dr] = make_str(i, y, 1);
    }
    sort(x + 1, x + dr + 1, cmp);
    df(1);
    long long rez;
    for(i = 1 ; i <= dr ; i++)
    {
        nod = x[i].ind;
        if(x[i].tip == 0)
        {
            update(poz[x[i].ind]);
        }
        else
        {
            int s = 0;
            dr2 = 0;
            for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
            {
                g[++dr2] = sum(poz[*it] + nr_fii[*it] - 1) - sum(poz[*it] - 1);
                s += g[dr2];
            }
            rez = 0;
            if(a[nod] <= b[nod])
            {
                s++;
                rez = s;
            }
            dr2 = 0;
            for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
            {
                dr2++;
                rez = 1LL * rez + 1LL * g[dr2] * (s - g[dr2]);
            }
            r[nod] = rez;
        }
    }
    for(i = 1 ; i <= n ; i++)
    {
        cout << r[i] << "\n";
    }
}