#include using namespace std; #define MAXN 100050 int N; int x; vector A[MAXN]; long long val[MAXN]; long long qval[MAXN]; vector, int> > Eval, Eqval; int S[MAXN]; int T[MAXN]; int K; vector Sv; int aib[2 * MAXN]; int lvl[MAXN]; long long ans[MAXN]; void dfs(int node, int prv) { lvl[node] = prv == -1 ? 0 : lvl[prv] + 1; S[node] = K++; for (int x : A[node]) { dfs(x, node); } T[node] = K++; } int query(int pos) { pos++; int ret = 0; while (pos > 0) { ret += aib[pos]; pos -= pos & (-pos); } return ret; } int query(int a, int b) { return query(b) - query(a - 1); } void update(int pos, int val) { pos++; while (pos <= 2 * N) { aib[pos] += val; pos += pos & (-pos); } } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); scanf("%d", &N); for (int i = 1; i < N; i++) { scanf("%d", &x); x--; A[x].push_back(i); } dfs(0, -1); for (int i = 0; i < N; i++) { scanf("%lld", &val[i]); Eval.push_back({{val[i], N - lvl[i]}, i}); Sv.push_back(val[i]); } for (int i = 0; i < N; i++) { scanf("%lld", &qval[i]); Eqval.push_back({{qval[i], N - lvl[i]}, i}); Sv.push_back(qval[i]); } sort(Sv.begin(), Sv.end()); Sv.resize(unique(Sv.begin(), Sv.end()) - Sv.begin()); sort(Eval.begin(), Eval.end()); sort(Eqval.begin(), Eqval.end()); int i = 0; // eval int j = 0; // eqval for (int x : Sv) { while (i < (int) Eval.size() && Eval[i].first.first <= x) { int node = Eval[i].second; update(S[node], 1); i++; } while (j < (int) Eqval.size() && Eqval[j].first.first <= x) { int sum = 0; int node = Eqval[j].second; if (val[node] <= qval[node]) { sum++; ans[node]++; } for (int y : A[node]) { int q = query(S[y], T[y]); ans[node] += (long long) q * sum * 2; sum += q; } j++; } } for (int i = 0; i < N; i++) { printf("%lld\n", ans[i]); } return 0; }