/*
    Look at me!
    Look at me!
    Look at how large the monster inside me has become!
*/
#include<fstream>
#include<iostream>
#include<cstdio>
#include<map>
#include<typeinfo>
#include<set>
#define FIT(a,b) for(vector<int >::iterator a=b.begin();a!=b.end();a++)
#define FITP(a,b) for(vector<pair<int,int> >::iterator a=b.begin();a!=b.end();a++)
#define RIT(a,b) for(vector<int>::reverse_iterator a=b.end();a!=b.begin();++a)
#include<stack>
#define ROF(a,b,c) for(int a=b;a>=c;--a)
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#define REP(a,b) for(register int a=0;a<b;++a)
#include<cstring>
#include<bitset>
#include<cmath>
#include<iomanip>
#define f cin
#define g cout
#include<queue>
#define INF 0x3f3f3f3f
#define debug cerr<<"OK";
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ld long double
#define ll long long
#define ull unsigned long long
#define eps 1.e-7
#define BUFMAX 10100100
#define M 100100
#define N 200100
#define NM 2000100
#define mod 1000000007
#define eps 1.e-10
using namespace std;
/*
int dx[]={-1,-1,-1,0,1,1,1,0};
int dy[]={-1,0,1,1,1,0,-1,-1};
*/
vector<int> v[N];
pair<long long,int> A[N],B[N];
ll sol[N],a[N],b[N];
int nr[N],poz[N],r[N],te;
int H[NM],rig[NM],lef[NM],R[NM],nor[N],nods,aux;
int x,n,arb[N];
void find(int nod,int st,int dr,int l,int r)
{
    if(st>=l&&dr<=r)
    {
        aux+=H[nod];
        return ;
    }
    int mij=(st+dr)>>1;
    if(l<=mij)
        find(lef[nod],st,mij,l,r);
    if(r>mij)
        find(rig[nod],mij+1,dr,l,r);
}
void df(int x)
{
    ++te;
    poz[x]=te;
    r[x]=te;
    FIT(it,v[x])
    {
        df(*it);
        r[x]=max(r[x],r[*it]);
    }
}
void dfs(int x)
{
    if(a[x]<=b[x])
        nr[x]=1;
    FIT(it,v[x])
        dfs(*it);

    sol[x]=nr[x];
    FIT(it,v[x])
    {
        int er=*it;
        aux=0;
        find(R[nor[x]],1,n,poz[*it],r[*it]);
        sol[x]+=1LL*aux*nr[x]*2;
        nr[x]+=aux;
    }
}
void atr(int x,int y)
{
    lef[x]=lef[y];
    rig[x]=rig[y];
    H[x]=H[y];
}
void upd(int nod,int old,int st,int dr,int p)
{
    if(st==dr)
    {
        H[nod]++;
        return ;
    }
    int mij=(st+dr)>>1;
    if(p<=mij)
    {
        ++nods;
        lef[nod]=nods;
        atr(lef[nod],lef[old]);
        upd(lef[nod],lef[old],st,mij,p);
    }
    else
    {
        ++nods;
        rig[nod]=nods;
        atr(rig[nod],rig[old]);
        upd(rig[nod],rig[old],mij+1,dr,p);
    }
    H[nod]=H[lef[nod]]+H[rig[nod]];
}
int main ()
{

    #ifndef ONLINE_JUDGE
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    #endif

    f>>n;
    FOR(i,2,n)
    {
        f>>x;
        v[x].pb(i);
    }
    FOR(i,1,n)
    {
        f>>a[i];
        A[i].fi=a[i];
        A[i].se=i;
    }
    sort(A+1,A+n+1);
    FOR(i,1,n)
    {
        f>>b[i];
        B[i].fi=b[i];
        B[i].se=i;
    }
    sort(B+1,B+n+1);
    df(1);
    int p=0;
    FOR(i,1,n)
    {
        while(p!=n&&A[p+1].fi<=B[i].fi)
        {
            ++p;
            R[p]=++nods;
            atr(R[p],R[p-1]);
            upd(R[p],R[p-1],1,n,poz[A[p].se]);
        }
        nor[B[i].se]=p;
    }
    dfs(1);
    FOR(i,1,n)
    g<<sol[i]<<"\n";
    return 0;
}