Cod sursa(job #778399)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define Size(c) \
int((c).size())
#define sortare(c) \
(c).rbegin(), (c).rend()
#define Parc(it, c) \
for (typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)
const int Nmax = 16005;
int N; long long Press[Nmax],Ret;
vector<int> Leg[Nmax];
void Get (int k)
{
vector<long long> T;
Parc ( it, Leg[k] )
Get (*it),
Press[k] += Press[*it],
T.push_back(Press[*it]);
sort( sortare(T) );
for (int i = 0; i < Size(T); ++i)
Ret += T[i]*(i+1);
}
int main()
{
freopen("dosare.in", "r", stdin);
freopen("dosare.out", "w", stdout);
scanf("%d", &N);
for (int i = 2; i <= N; ++i)
{
int father;
scanf("%d", &father);
Leg[father].push_back(i);
}
for (int i = 1; i <= N; ++i)
scanf("%lld", Press+i);
Get (1);
printf("%lld\n", Ret + Press[1]);
}