#include #include #include #define Nmax 100005 using namespace std; vector L[Nmax]; int len,poz[Nmax],inf[Nmax],tata[Nmax]; long long Val[Nmax],BigVal[Nmax],v[Nmax]; vector 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<