#include #include #include #define Nmax 200005 using namespace std; vector 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 Value0;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