Cod sursa(job #478936)
#include<fstream>
#include<algorithm>
#include<vector>
#define x first
#define y second
using namespace std;
const char iname[]="dosare.in";
const char oname[]="dosare.out";
const int maxn=16007;
ifstream f(iname);
ofstream g(oname);
pair<long long,long long> a[maxn];
vector<int> E[maxn];
int n,i,x;
bool fcomp(int x,int y)
{
if(a[x].x!=a[y].x)
return a[x].x>a[y].x;
return a[x].y>a[y].y;
}
void go(int x)
{
a[x].y+=a[x].x;
if(E[x].size()==0)
return;
for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
go(*it);
sort(E[x].begin(),E[x].end(),fcomp);
for(int i=0;i<(int)E[x].size();++i)
a[x].y+=(i+1)*a[E[x][i]].x+a[E[x][i]].y,a[x].x+=a[E[x][i]].x;
}
int main()
{
f>>n;
for(i=2;i<=n;++i)
f>>x,E[x].push_back(i);
for(i=1;i<=n;++i)
f>>a[i].x;
go(1);
g<<a[1].y<<"\n";
}