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

using namespace std;

vector <int> L[Nmax];
int len,poz[Nmax],inf[Nmax],tata[Nmax];
long long Val[Nmax],BigVal[Nmax],v[Nmax];
vector <long long> aint[5*Nmax];

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

inline void Build(int nod, int st, int dr)
{
    if(st==dr)
    {
        aint[nod].push_back(v[st]);
        return;
    }
    int mij=((st+dr)>>1);
    Build(2*nod,st,mij); Build(2*nod+1,mij+1,dr);
    aint[nod].resize(aint[2*nod].size()+aint[2*nod+1].size());
    merge(aint[2*nod].begin(),aint[2*nod].end(),aint[2*nod+1].begin(),aint[2*nod+1].end(),aint[nod].begin());
}

inline int Query(int nod, int st, int dr, int x, int y, long long Value)
{
    if(st==x  && y==dr)
    {
        int pozz=upper_bound(aint[nod].begin(),aint[nod].end(),Value)-aint[nod].begin();
        if(pozz<0 || pozz>aint[nod].size()-1) return aint[nod].size();
        return pozz;
    }
    int mij=((st+dr)>>1);
    if(y<=mij) return Query(2*nod,st,mij,x,y,Value);
    else
        if(x>mij) return Query(2*nod+1,mij+1,dr,x,y,Value);
        else return Query(2*nod,st,mij,x,mij,Value)+Query(2*nod+1,mij+1,dr,mij+1,y,Value);
}

int main()
{
    int i,x,n;
    #ifndef ONLINE_JUFGE
        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);
    Build(1,1,n);
    for(i=2;i<=n;++i)
        inf[i]=Query(1,1,n,poz[i],poz[i]+L[i].size(),BigVal[tata[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;
}