#include <cstdio>
#include <vector>
#include <set>
#include <map>

using namespace std;

#define maxn 100010
#define mlog 25

int niv[maxn], d[maxn],  bf[maxn];
long long value[maxn], bvalue[maxn];
int nl, mval, n, m, x, y;
vector<int> v[maxn];
multiset<int> g[mlog];
int aib[mlog][maxn*2];
map<long long, int> norm;
long long sol[maxn];

void df(int nod)
{
    d[nod]=1;
    if(v[nod].size()==0)
        return;

    int fmax, it, dmax=0;

    for(int i=0; i<v[nod].size(); ++i)
    {
        it=v[nod][i];
        niv[it]=niv[nod]+1;

        df(it);

        d[nod]+=d[it];
        if(d[it]>dmax)
        {
            dmax=d[it];
            fmax=(it);
        }
    }

    bf[nod]=fmax;
}

inline int lsb(int x)
{
    return (x&(x-1))^x;
}

void update(int aib[], int poz, int val)
{
    while(poz<=mval)
    {
        aib[poz]+=val;
        poz+=lsb(poz);
    }
}

int query(int aib[], int poz)
{
    int sol=0;

    while(poz>0)
    {
        sol+=aib[poz];
        poz-=lsb(poz);
    }

    return sol;
}

void df2(int nod, int hops)
{
    d[nod]=1;

    int fiu, dmax=0;

    if(v[nod].size()==0)
    {
        g[hops].insert((int)value[nod]);
        update(aib[hops], value[nod], 1);
        if(value[nod]<=bvalue[nod])
            sol[nod]=1;

        return;
    }

    df2(bf[nod], hops);

    int cnm=query(aib[hops], bvalue[nod]);

    update(aib[hops], value[nod], 1);
    g[hops].insert((int)value[nod]);

    if(value[nod]<=bvalue[nod])
        sol[nod]+=2*cnm;

    if(value[nod]<=bvalue[nod])
    {
        ++sol[nod];
        ++cnm;
    }

    int fromFiu;

    for(int i=0; i<v[nod].size(); ++i)
    {
        fiu=v[nod][i];
        if(fiu==bf[nod])
            continue;

        df2(fiu, hops+1);

        fromFiu=0;

        for(multiset<int> :: iterator it = g[hops+1].begin(); it != g[hops+1].end(); ++it)
        {
            update(aib[hops], *it, 1);
            update(aib[hops+1], *it, -1);
            g[hops].insert(*it);
            if(*it<=bvalue[nod])
            {
                sol[nod]+=2*cnm;
                ++fromFiu;
            }
        }

        g[hops+1].clear();
        cnm+=fromFiu;
    }
}

int main()
{
  //  freopen("lca.in", "r", stdin);
  //  freopen("lca.out", "w", stdout);

    scanf("%d", &n);
    for(int i=2; i<=n; ++i)
    {
        scanf("%d", &x);
        v[x].push_back(i);
    }
    for(int i=1; i<=n; ++i)
    {
        scanf("%lld", &value[i]);
        norm[value[i]]=1;
    }
    for(int i=1; i<=n; ++i)
    {
        scanf("%lld", &bvalue[i]);
        norm[bvalue[i]]=1;
    }

    mval=0;
    for(map<long long, int> :: iterator it = norm.begin(); it != norm.end(); ++it)
    {
        ++mval;
        it->second=mval;
    }

    for(int i=1; i<=n; ++i)
    {
        value[i]=norm[value[i]];
        bvalue[i]=norm[bvalue[i]];
    }

    niv[1]=1;
    df(1);
    df2(1, 0);

    for(int i=1; i<=n; ++i)
        printf("%lld\n", sol[i]);

    return 0;
}