Language: C++

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){
	ll x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*f;
}
struct edge{
	int to,nxt;
}g[1100101];
int tot,dep[1010101],head[1010101],a[1010101],fa[1010101];
inline void made(int from,int to){
	g[++tot].to=to;g[tot].nxt=head[from];head[from]=tot;
}
void dfs(int u){
	dep[u]=dep[fa[u]]+1;
	for (int i=head[u];i;i=g[i].nxt){
		int v=g[i].to;
		if (v==fa[u]) continue;
		dfs(v);
	}
}
struct data{
	long double x;
	int sz,f,X;
}F[1010101];
int find(int u){
	if (F[u].f!=u) return F[u].f=find(F[u].f);
	return F[u].f;
}
inline bool operator < (data a,data b){
	return (fabs(a.x-b.x)<1e-23?(dep[a.f]==dep[b.f]?a.f<b.f:dep[a.f]>dep[b.f]):a.x<b.x);
}
set<data> S;
ll ans;
int main(){
	int n=read();
	for (int i=2;i<=n;i++){
		fa[i]=read();
		made(fa[i],i);made(i,fa[i]);
	}
	dfs(1);
	for (int i=1;i<=n;i++){
		a[i]=read();F[i].f=i,F[i].sz=1;
		F[i].x=a[i];F[i].X=a[i];
		if (i!=1) S.insert(F[i]);
	}
	data now;
	bool flag=1;
	while (S.size()){
		now=(*S.begin());
		S.erase(now);
		int FA=find(fa[now.f]);
		ans+=1ll*F[FA].X*(F[now.f].sz-F[now.f].X);
		if (S.find(F[FA])!=S.end()) S.erase(F[FA]);
		F[FA].sz+=F[now.f].sz;
		F[FA].X+=F[now.f].X;
		F[FA].x=(long double)F[FA].X/(long double)F[FA].sz;
		F[now.f].f=FA;
		if (FA!=1) S.insert(F[FA]);
	}
	cout<<ans;
	return 0;
}

Compiler output:
a.cc:33:13: error: declaration of 'operator<' as non-function
   33 | inline bool operator < (data a,data b){
      |             ^~~~~~~~
a.cc:33:25: error: reference to 'data' is ambiguous
   33 | inline bool operator < (data a,data b){
      |                         ^~~~
In file included from /usr/include/c++/14/string:53,
                 from /usr/include/c++/14/bitset:52,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:52,
                 from a.cc:1:
/usr/include/c++/14/bits/range_access.h:344:5: note: candidates are: 'template<class _Tp> constexpr const _Tp* std::data(initializer_list<_Tp>)'
  344 |     data(initializer_list<_Tp> __il) noexcept
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:334:5: note:                 'template<class _Tp, long unsigned int _Nm> constexpr _Tp* std::data(_Tp (&)[_Nm])'
  334 |     data(_Tp (&__array)[_Nm]) noexcept
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:323:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(const _Container&)'
  323 |     data(const _Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:312:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(_Container&)'
  312 |     data(_Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
a.cc:25:8: note:                 'struct data'
   25 | struct data{
      |        ^~~~
a.cc:33:32: error: reference to 'data' is ambiguous
   33 | inline bool operator < (data a,data b){
      |                                ^~~~
/usr/include/c++/14/bits/range_access.h:344:5: note: candidates are: 'template<class _Tp> constexpr const _Tp* std::data(initializer_list<_Tp>)'
  344 |     data(initializer_list<_Tp> __il) noexcept
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:334:5: note:                 'template<class _Tp, long unsigned int _Nm> constexpr _Tp* std::data(_Tp (&)[_Nm])'
  334 |     data(_Tp (&__array)[_Nm]) noexcept
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:323:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(const _Container&)'
  323 |     data(const _Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:312:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(_Container&)'
  312 |     data(_Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
a.cc:25:8: note:                 'struct data'
   25 | struct data{
      |        ^~~~
a.cc:36:9: error: template argument 1 is invalid
   36 | set<data> S;
      |         ^
a.cc:36:9: error: template argument 2 is invalid
a.cc:36:9: error: template argument 3 is invalid
a.cc: In function 'int main()':
a.cc:48:29: error: request for member 'insert' in 'S', which is of non-class type 'int'
   48 |                 if (i!=1) S.insert(F[i]);
      |                             ^~~~~~
a.cc:50:9: error: reference to 'data' is ambiguous
   50 |         data now;
      |         ^~~~
/usr/include/c++/14/bits/range_access.h:344:5: note: candidates are: 'template<class _Tp> constexpr const _Tp* std::data(initializer_list<_Tp>)'
  344 |     data(initializer_list<_Tp> __il) noexcept
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:334:5: note:                 'template<class _Tp, long unsigned int _Nm> constexpr _Tp* std::data(_Tp (&)[_Nm])'
  334 |     data(_Tp (&__array)[_Nm]) noexcept
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:323:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(const _Container&)'
  323 |     data(const _Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
/usr/include/c++/14/bits/range_access.h:312:5: note:                 'template<class _Container> constexpr decltype (__cont.data()) std::data(_Container&)'
  312 |     data(_Container& __cont) noexcept(noexcept(__cont.data()))
      |     ^~~~
a.cc:25:8: note:                 'struct data'
   25 | struct data{
      |        ^~~~
a.cc:52:18: error: request for member 'size' in 'S', which is of non-class type 'int'
   52 |         while (S.size()){
      |                  ^~~~
a.cc:53:17: error: 'now' was not declared in this scope; did you mean 'pow'?
   53 |                 now=(*S.begin());
      |                 ^~~
      |                 pow
a.cc:53:25: error: request for member 'begin' in 'S', which is of non-class type 'int'
   53 |                 now=(*S.begin());
      |                         ^~~~~
a.cc:54:19: error: request for member 'erase' in 'S', which is of non-class type 'int'
   54 |                 S.erase(now);
      |                   ^~~~~
a.cc:57:23: error: request for member 'find' in 'S', which is of non-class type 'int'
   57 |                 if (S.find(F[FA])!=S.end()) S.erase(F[FA]);
      |                       ^~~~
a.cc:57:38: error: request for member 'end' in 'S', which is of non-class type 'int'
   57 |                 if (S.find(F[FA])!=S.end()) S.erase(F[FA]);
      |                                      ^~~
a.cc:57:47: error: request for member 'erase' in 'S', which is of non-class type 'int'
   57 |                 if (S.find(F[FA])!=S.end()) S.erase(F[FA]);
      |                                               ^~~~~
a.cc:62:30: error: request for member 'insert' in 'S', which is of non-class type 'int'
   62 |                 if (FA!=1) S.insert(F[FA]);
      |                              ^~~~~~