#include using namespace std; typedef int64_t var; #define MAXN 100005 int64_t Rez[MAXN], Value[MAXN], BigValue[MAXN]; #define MAX 300000 var Tree[MAX]; #define zeros(a) (a&(-a)) void add(var poz) { for(;poz G[MAXN]; int64_t dfs(var node, var from) { var ret = -sum(BigValue[from]); var aux = sum(BigValue[node]); add(Value[node]); for(auto vec : G[node]) { Rez[node] -= dfs(vec, node); } aux = sum(BigValue[node]) - aux; Rez[node] += 1LL*aux*aux; ret += sum(BigValue[from]); return 1LL*ret*ret; } unordered_map Map; vector V; int main() { #ifndef ONLINE_JUDGE freopen("debug.in", "r", stdin); freopen("debug.out", "w", stdout); #endif // ONLINE_JUDGE var n, p; cin>>n; for(var i=2; i<=n; i++) { cin>>p; G[p].push_back(i); } for(var i=1; i<=n; i++) { cin>>Value[i]; Map[Value[i]] = 1; } for(var i=1; i<=n; i++) { cin>>BigValue[i]; Map[BigValue[i]] = 1; } for(auto &p: Map) {V.emplace_back(p.first);} sort(V.begin(), V.end()); var i=0; for(auto v : V) Map[v] = ++i; for(var i=1; i<=n; i++) { Value[i] = Map[Value[i]]; BigValue[i] = Map[BigValue[i]]; } dfs(1, 0); for(var i=1; i<=n; i++) { cout<