/** * code generated by JHelper * More info: https://github.com/AlexeyDmitriev/JHelper * @author Ildar */ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const int N = 2e5 + 7; const int K = 20; vector g[N]; int a[N]; ll dp[N]; int par[N]; int cnt[N]; int ver[N]; struct data { int st[N][K]; int res[N]; int cur; data() { res[0] = -1e9; cur = 1; for (int i = 0; i < N; i++) { for (int j = 0; j < K; j++) { st[i][j] = 0; } } } pair get(int v, int x, int u) { for (int i = K - 1; i >= 0; i--) { if (res[st[v][i]] >= x) { v = st[v][i]; } } int t = st[v][0]; if (res[v] < x) { t = v; } st[cur][0] = t; for (int i = 1; i < K; i++) { st[cur][i] = st[st[cur][i - 1]][i - 1]; } res[cur] = x; ver[cur] = u; return make_pair(t, cur++); } }; data d; void dfs(int v, int was) { auto t = d.get(was, a[v], v); if (t.first != 0) { int p = ver[t.first]; dp[v] = dp[p] + (cnt[v] - cnt[p]) * (ll) a[v]; } else { dp[v] = cnt[v] * (ll) a[v]; } for (auto to : g[v]) { cnt[to] = cnt[v] + 1; dfs(to, t.second); } } class Main { public: void solve(std::istream &in, std::ostream &out) { int n; in >> n; cnt[1] = 1; par[1] = 1; for (int i = 2; i <= n; i++) { int p; in >> p; par[i] = p; g[p].push_back(i); } for (int i = 1; i <= n; i++) { in >> a[i]; } dfs(1, 0); for (int i = 1; i <= n; i++) { out << dp[i] << ' '; } out << '\n'; } }; int main() { ios::sync_with_stdio(0); Main solver; std::istream &in(std::cin); std::ostream &out(std::cout); solver.solve(in, out); return 0; }