#include #include #include #include using namespace std; #define maxn 100010 #define mlog 25 int niv[maxn], d[maxn], bf[maxn]; long long value[maxn], bvalue[maxn]; int nl, mval, n, m, x, y; vector v[maxn]; multiset g[mlog]; int aib[mlog][maxn*2]; map norm; long long sol[maxn]; void df(int nod) { d[nod]=1; if(v[nod].size()==0) return; int fmax, it, dmax=0; for(int i=0; idmax) { dmax=d[it]; fmax=(it); } } bf[nod]=fmax; } inline int lsb(int x) { return (x&(x-1))^x; } void update(int aib[], int poz, int val) { while(poz<=mval) { aib[poz]+=val; poz+=lsb(poz); } } int query(int aib[], int poz) { int sol=0; while(poz>0) { sol+=aib[poz]; poz-=lsb(poz); } return sol; } void df2(int nod, int hops) { d[nod]=1; int fiu, dmax=0; if(v[nod].size()==0) { g[hops].insert((int)value[nod]); update(aib[hops], value[nod], 1); if(value[nod]<=bvalue[nod]) sol[nod]=1; return; } df2(bf[nod], hops); int cnm=query(aib[hops], bvalue[nod]); update(aib[hops], value[nod], 1); g[hops].insert((int)value[nod]); if(value[nod]<=bvalue[nod]) sol[nod]+=2*cnm; if(value[nod]<=bvalue[nod]) { ++sol[nod]; ++cnm; } int fromFiu; for(int i=0; i :: iterator it = g[hops+1].begin(); it != g[hops+1].end(); ++it) { update(aib[hops], *it, 1); update(aib[hops+1], *it, -1); g[hops].insert(*it); if(*it<=bvalue[nod]) { sol[nod]+=2*cnm; ++fromFiu; } } g[hops+1].clear(); cnm+=fromFiu; } } int main() { // freopen("lca.in", "r", stdin); // freopen("lca.out", "w", stdout); scanf("%d", &n); for(int i=2; i<=n; ++i) { scanf("%d", &x); v[x].push_back(i); } for(int i=1; i<=n; ++i) { scanf("%lld", &value[i]); norm[value[i]]=1; } for(int i=1; i<=n; ++i) { scanf("%lld", &bvalue[i]); norm[bvalue[i]]=1; } mval=0; for(map :: iterator it = norm.begin(); it != norm.end(); ++it) { ++mval; it->second=mval; } for(int i=1; i<=n; ++i) { value[i]=norm[value[i]]; bvalue[i]=norm[bvalue[i]]; } niv[1]=1; df(1); df2(1, 0); for(int i=1; i<=n; ++i) printf("%lld\n", sol[i]); return 0; }