#include #include #include using namespace std; int N; vector V[100002]; long long A[100002], B[100002]; int posA[100002], posB[100002]; int in[100002], out[100002], whnow; long long result[100002]; int AIB[100002]; void update(int pos, int val) { for (; pos <= 100000; pos += pos & -pos) AIB[pos] += val; } int query(int pos) { int sum = 0; for (; pos >= 1; pos -= pos & -pos) sum += AIB[pos]; return sum; } void Dfs(int x) { in[x] = ++whnow; for (auto nod : V[x]) Dfs(nod); out[x] = whnow; } inline bool compareA(const int& i1, const int& i2) { return A[i1] < A[i2]; } inline bool compareB(const int& i1, const int& i2) { return B[i1] < B[i2]; } int main() { cin.sync_with_stdio(false); cin >> N; for (int i = 2, father; i <= N; ++i) { cin >> father; V[father].push_back(i); } for (int i = 1; i <= N; ++i) { cin >> A[i]; posA[i] = i; } for (int i = 1; i <= N; ++i) { cin >> B[i]; posB[i] = i; } Dfs(1); sort(posA + 1, posA + N + 1, compareA); sort(posB + 1, posB + N + 1, compareB); int now = 1; for (int i = 1; i <= N; ++i) { while (now <= N && A[posA[now]] <= B[posB[i]]) { update(in[posA[now]], 1); ++now; } if (A[posB[i]] <= B[posB[i]]) ++result[posB[i]]; int total = 0; for (auto nxt : V[posB[i]]) { int sum = query(out[nxt]) - query(in[nxt] - 1); total += sum; if (A[posB[i]] <= B[posB[i]]) result[posB[i]] += 2 * sum; } for (auto nxt : V[posB[i]]) { int sum = query(out[nxt]) - query(in[nxt] - 1); result[posB[i]] += ((long long) sum) * (total - sum); } } for (int i = 1; i <= N; ++i) cout << result[i] << '\n'; }