#include <bits/stdc++.h>
#include "tree.h"
using namespace std;
const int mxN = 2e5 + 100;
vector <int> adj[mxN];
long long w[mxN];
pair <long long, long long> dfs (int u, int par, int l, int r) {
long long ans = 0, csm = 0;
for (auto v : adj[u]) {
if (v ^ par) {
auto x = dfs (v, u, l, r);
ans += x.first * 1LL, csm += x.second * 1LL;
}
}
long long ncost = abs (l - csm), ntotal = l;
if (csm <= r) ncost = 0, ntotal = csm;
if (csm < l) ncost = l - csm, ntotal = l;
return {ans * 1LL + ncost * w[u] * 1LL, ntotal};
}
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;
}