#include #define in cin #define out cout #define abs(x) ((x>0)?(x):(-(x))) #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define FOR(i, a, b) for(int i = a; i <= b; ++i) #define DOWNFOR(i, a, b) for(int i = a; i >= b; --i) #define FOREACH(i, t) for (typeof(t.begin()) i = t.begin(); i != t.end(); ++i) using namespace std; typedef long long ll; const int Nmax = 100001; vector G[Nmax]; int N,T[Nmax],st[Nmax],dr[Nmax]; vector Ans[Nmax]; ll V[Nmax],BV[Nmax]; struct tr{ tr *st,*dr; ll val; int pri,many; tr(){ st=dr=NULL; val=many=0;pri=rand(); } tr(ll _x){ st=dr=NULL; val=_x;many=1;pri=rand(); } }; tr* root; void refr(tr *n){ n->many=1; if(n->st) n->many+=n->st->many; if(n->dr) n->many+=n->dr->many; } tr* rotright(tr *n){ tr* b=n->st; n->st=b->dr,b->dr=n; refr(n),refr(b); return b; } tr* rotleft(tr *n){ tr* b=n->dr; n->dr=b->st,b->st=n; refr(n),refr(b); return b; } tr* balance(tr *n){ if(n->st && n->st->pri > n->pri) return rotright(n); else if(n->dr && n->dr->pri > n->pri) return rotleft(n); refr(n); return n; } tr* insert(tr* n,ll x){ if(!n) return n=new tr(x); if( x <= n->val) n->st=insert(n->st,x); else n->dr=insert(n->dr,x); return balance(n); } int query(tr* n,ll val){ if(val < n->val){ if(n->st) return query(n->st,val); else return 0; } else{ if(n->dr) return ( ( n->st ?n->st->many:0)+1 + query(n->dr,val) ); else return (( n->st ?n->st->many:0)+1); } } void dfs(int x){ if(T[x]!=0){ int val=BV[T[x]]; st[x]=query(root,val); } root=insert(root,V[x]); for(vector::iterator it=G[x].begin();it!=G[x].end();++it){ dfs(*it); } if(T[x]!=0){ int val=BV[T[x]]; dr[x]=query(root,val); Ans[T[x]].push_back(dr[x]-st[x]); } } int main(){ #ifndef ONLINE_JUDGE ifstream in("test.in"); ofstream out("test.out"); #endif srand(time(0)); in>>N; for(int i=2;i<=N;i++){ in>>T[i]; G[T[i]].push_back(i); } for(int i=1;i<=N;i++) in>>V[i]; for(int i=1;i<=N;i++) in>>BV[i]; dfs(1); for(int i=1;i<=N;i++){ int many=0; for(vector::iterator it=Ans[i].begin();it!=Ans[i].end();++it){ many+=*it; } ll ans=0; for(vector::iterator it=Ans[i].begin();it!=Ans[i].end();++it){ ans += 1LL * (many-(*it)) * (*it);; } if(V[i]<=BV[i]) ans+=2*many+1; out<