#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; }