#include #include #include #include #include using namespace std; //ifstream fin("date.in"); //ofstream fout("date.out"); #define MAX 100010 typedef vector :: iterator iter; vector G[MAX]; struct str{ int ind, val, tip; } x[2 * MAX]; str make_str(int i, int v, int t) { str se; se.ind = i; se.val = v; se.tip = t; return se; } inline bool cmp(str a, str b) { if(a.val == b.val) { return a.tip < b.tip; } return a.val < b.val; } int dad[MAX], a[MAX], b[MAX]; int poz[MAX], dr2, nr_fii[MAX], n, AIB[MAX], g[MAX]; long long r[MAX]; void df(int nod) { ++dr2; // st[dr2] = nod; poz[nod] = dr2; nr_fii[nod] = 1; for(iter it = G[nod].begin() ; it != G[nod].end() ; it++) { df(*it); nr_fii[nod] += nr_fii[*it]; } } void update(int p) { while(p <= n) { AIB[p]++; p += (p & (-p)); } } int sum(int p) { int s = 0; while(p) { s += AIB[p]; p -= (p & (-p)); } return s; } int main() { int i, y, dr = 0, nod; cin >> n; for(i = 2; i <= n ; i++) { cin >> dad[i]; G[dad[i]].push_back(i); } for(i = 1 ; i <= n ; i++) { cin >> y; a[i] = y; x[++dr] = make_str(i, y, 0); } for(i = 1 ; i <= n ; i++) { cin >> y; b[i] = y; x[++dr] = make_str(i, y, 1); } sort(x + 1, x + dr + 1, cmp); df(1); long long rez; for(i = 1 ; i <= dr ; i++) { nod = x[i].ind; if(x[i].tip == 0) { update(poz[x[i].ind]); } else { int s = 0; dr2 = 0; for(iter it = G[nod].begin() ; it != G[nod].end() ; it++) { g[++dr2] = sum(poz[*it] + nr_fii[*it] - 1) - sum(poz[*it] - 1); s += g[dr2]; } rez = 0; if(a[nod] <= b[nod]) { s++; rez = s; } dr2 = 0; for(iter it = G[nod].begin() ; it != G[nod].end() ; it++) { dr2++; rez = 1LL * rez + 1LL * g[dr2] * (s - g[dr2]); } r[nod] = rez; } } for(i = 1 ; i <= n ; i++) { cout << r[i] << "\n"; } }