#include using namespace std; #define MAXN 100003 vector > v; int n; long long val[MAXN]; long long big_val[MAXN]; int l[MAXN]; int r[MAXN]; int bit[MAXN]; long long res[MAXN]; int p = 0; void update(int x, int delta){ while(x<=n){ bit[x] += delta; x+= x&-x; } } int query(int x){ int sum = 0; while(x>0){ sum+=bit[x]; x-= x&-x; } return sum; } int query(int b, int e){ if(b>e) return 0; return query(e) - query(b-1); } void dfs(int x){ l[x] = ++p; for(int i=0; i()); for(int i=2; i<=n; ++i){ int x; scanf("%d", &x); v[x].push_back(i); } vector, int > > pairs; for(int i=1; i<=n; ++i){ scanf("%lld", &val[i]); pairs.push_back(make_pair(make_pair(val[i], false), i)); } for(int i=1; i<=n; ++i){ scanf("%lld", &big_val[i]); pairs.push_back(make_pair(make_pair(big_val[i], true), i)); } dfs(1); sort(pairs.begin(), pairs.end()); for(int i=0; i, int > curr = pairs[i]; bool is_big_val = curr.first.second; int curr_node = curr.second; if(is_big_val){ long long sum = query(l[curr_node]+1, r[curr_node]); long long curr_res = val[curr_node] <= big_val[curr_node]?curr_res = 2*sum+1:0; for(int i=0; i