#include <bits/stdc++.h>
#include "tree.h"
using namespace std;
const int mxN = 2e5 + 100;
vector <int> adj[mxN];
int w[mxN];
pair <long long, long long> dfs (int u, int par, int l, int r) {
long long ans = 0, csm = 0, leaf = 1;
for (auto v : adj[u]) {
if (v ^ par) {
auto x = dfs (v, u, l, r);
ans += x.first, csm += x.second;
leaf = 1;
}
}
if (leaf) return {l * w[u], l};
int cur = l - csm;
return {ans + cur * w[u], l};
}
void init(vector<int> P, vector<int> W) {
int n = (int) P.size();
for (int i = 1; i < n; ++i) {
adj[i].push_back(P[i]);
adj[P[i]].push_back(i);
}
for (int i = 0; i < n; ++i) {
w[i] = W[i];
}
}
long long query(int L, int R) {
return dfs(0, 0, L, R).first;
}