#include <iostream>
#include <vector>
#include <algorithm>
#define Nmax 200005

using namespace std;

vector <int> L[Nmax],Solve[Nmax];
int len,poz[Nmax],inf[Nmax],tata[Nmax],n,aib[Nmax];
long long Val[Nmax],BigVal[Nmax],v[Nmax];

struct interval
{
    int st,dr,poz;
    long long Value;
    bool operator <(const interval A) const
    {
        return Value<A.Value;
    }
} Int[Nmax];

inline void Dfs(int nod)
{
    v[++len]=Val[nod]; poz[nod]=len;
    for(auto it : L[nod]) Dfs(it);
}

inline void Update(int p)
{
    int i;
    for(i=p;i<=n;i+=(i&(-i))) ++aib[i];
}

inline int Query(int p)
{
    int i,sol=0;
    for(i=p;i>0;i-=(i&(-i))) sol+=aib[i];
    return sol;
}

int main()
{
    int i,x;
    #ifndef ONLINE_JUDGE
        freopen ("date.in","r",stdin);
        freopen ("date.out","w",stdout);
    #endif
    cin>>n;
    for(i=2;i<=n;++i)
    {
        cin>>x;
        tata[i]=x;
        L[x].push_back(i);
    }
    for(i=1;i<=n;++i) cin>>Val[i];
    for(i=1;i<=n;++i) cin>>BigVal[i];
    Dfs(1);

    for(i=2;i<=n;++i)
    {
        Int[i-1].st=poz[i]; Int[i-1].dr=poz[i]+L[i].size(); Int[i-1].Value=BigVal[tata[i]];
        Int[i-1].poz=i;
    }
    sort(Int+1,Int+n);
    for(i=1;i<=n;++i)
    {
        interval w;
        w.Value=v[i];
        int pozz=lower_bound(Int+1,Int+n,w)-Int;
        if(pozz<1 || pozz>n-1) continue;
        Solve[pozz].push_back(i);
    }

    for(i=1;i<n;++i)
    {
        for(auto it :  Solve[i]) Update(it);
        inf[Int[i].poz]=Query(Int[i].dr)-Query(Int[i].st-1);
    }

    //for(i=2;i<=n;++i) cout<<inf[i]<<" ";

    for(i=1;i<=n;++i)
    {
        long long sum=0,sol=0;
        for(auto it : L[i]) sum+=inf[it];
        for(auto it : L[i]) sol=sol+1LL*inf[it]*(sum-inf[it]);
        if(Val[i]<=BigVal[i]) sol+=1+sum*2;
        cout<<sol<<"\n";
    }
    return 0;
}