#include<bits/stdc++.h>
#define mp make_pair
#define PII pair<int,int>
#define fi first
#define se second
using namespace std;

const int NMAX=100005;
const int XMAX=200005;

int n,m,len,start[NMAX],stop[NMAX],AIB[NMAX];
long long a[NMAX],b[NMAX],sol[NMAX];
vector<int>v[NMAX];
vector<int>::iterator it;
pair<long long,PII> ev[XMAX];

void Dfs(int x)
{
    len++;
    start[x]=len;
    for (vector<int>::iterator pit=v[x].begin();pit!=v[x].end();pit++)
        Dfs(*pit);
    stop[x]=len;
}

void Update(int poz,int val)
{
    for (int i=poz;i<=n;i+=i+=(i&(-i))) AIB[i]+=val;
}

int Query(int poz)
{
    int i,rez=0;
    for (i=poz;i>=1;i-=i+=(i&(-i))) rez+=AIB[i];
    return rez;
}

int main()
{
    int i,x;
    long long sum,kk,aux;
   // freopen("date.in","r",stdin);
   // freopen("date.out","w",stdout);
    cin.sync_with_stdio(false);
    cin>>n;
    for (i=1;i<n;i++)
    {
        cin>>x;
        v[x].push_back(i+1);
    }
    for (i=1;i<=n;i++) cin>>a[i],ev[++m]=mp(a[i],mp(1,i));
    for (i=1;i<=n;i++) cin>>b[i],ev[++m]=mp(b[i],mp(2,i));
    sort(ev+1,ev+m+1);
    Dfs(1);

    for (i=1;i<=m;i++)//mergem prin events
        if (ev[i].se.fi==1)//update
            Update(start[ev[i].se.se],1);
        else
        {
            x=ev[i].se.se;sum=kk=0;
            for (it=v[x].begin();it!=v[x].end();it++)
                {
                    aux=Query(stop[*it])-Query(start[*it]-1);
                    sum+=aux;
                    kk+=aux*aux;
                }
            sol[ev[i].se.se]=sum*sum-kk;
            if (a[x]<=b[x])
                sol[ev[i].se.se]+=2*sum+1;
        }

    for (i=1;i<=n;i++) cout<<sol[i]<<"\n";
    return 0;
}