#include <vector>
#include <unordered_map>
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
typedef long long var;

#define MAXN 100005
var Rez[MAXN], Value[MAXN], BigValue[MAXN];

#define MAX 300000
var Tree[MAX];
#define zeros(a) (a&(-a))
void add(var poz) {
    for(;poz<MAX;poz+=zeros(poz))
        Tree[poz] ++;
}
var sum(var poz) {
    var s = 0;
    for(;poz;poz-=zeros(poz))
        s += Tree[poz];
    return s;
}


vector<var> G[MAXN];

var 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<var, var> Map;
vector<var> 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.push_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<<Rez[i]<<'\n';
    }
}