#include #include #include #include using namespace std; int n, tata[100100], R, ind[100100]; long long sol, afis[100100]; vector G[100100], v[100100]; long long val[100100], bigval[100100]; void Interclasare() { int ind = -1; vector ::iterator it, jt; for(it = G[R].begin(); it != G[R].end(); ++it) if(ind == -1 || v[*it].size() > v[ind].size()) ind = *it; if(ind > 0) v[R] = v[ind]; for(it = G[R].begin(); it != G[R].end(); ++it) { if(*it == ind) continue; for(jt = v[*it].begin(); jt != v[*it].end(); ++jt) v[R].push_back(*jt); v[*it].clear(); } v[ind].clear(); v[R].push_back(val[R]); sort(v[R].begin(), v[R].end()); } int main() { //freopen("D.in", "r", stdin); int i, total, sz; vector ::iterator it; cin >> n; for(i = 2; i <= n; ++i) { cin >> tata[i]; G[tata[i]].push_back(i); } for(i = 1; i <= n; ++i) cin >> val[i]; for(i = 1; i <= n; ++i) cin >> bigval[i]; for(R = n; R > 0; --R) { sol = 0LL; total = 0; for(it = G[R].begin(); it != G[R].end(); ++it) { sz = lower_bound(v[*it].begin(), v[*it].end(), bigval[R] + 1LL) - v[*it].begin(); total += sz; sol -= 1LL * sz * (sz - 1); if(val[R] <= bigval[R]) sol += 2LL * sz; } sol += 1LL * total * (total - 1); Interclasare(); if(val[R] <= bigval[R]) sol++; afis[R] = sol; } for(i = 1; i <= n; ++i) cout << afis[i] << "\n"; return 0; }