#include #include #include using namespace std; typedef long long ll; void get_height( const vector &parent, const vector &used, vector &height, int node) { if( node == 0 or used[node] ) { height[node] = 0; return; } if( height[parent[node]] < 0) get_height(parent, used, height, parent[node]); height[node] = height[parent[node]]+1; } void remove_parents( const vector &parent, vector &used, int node ) { if( !used[node] ) { used[node] = true; if( node != 0 ) remove_parents( parent, used, parent[node] ); } } int main() { int n,k; cin >> n >> k; vector a(k); for( int i= 0; i < k; i++ ) cin >> a[i]; sort( a.rbegin(), a.rend() ); vector parent(n); vector used(n, false); vector is_leaf(n, true); for( int i = 1; i < n; i++ ) { int tmp; cin >> tmp; parent[i] = tmp; is_leaf[tmp] = false; } vector leafs; for( int i = 0; i < n; i++ ) { if( is_leaf[i] ) leafs.push_back(i); } vector height(n); ll sm = 0; for( int i = 0; i < k; i++ ) { fill( height.begin(), height.end(), -1); int bestheight = -1; int bestleaf = -1; for( int j = 0; j < k; j++ ) { int leaf = leafs[j]; get_height( parent, used, height, leaf ); if( height[leaf] > bestheight ) { bestheight = height[leaf]; bestleaf = leaf; } } sm += bestheight * a[i]; remove_parents( parent, used, bestleaf ); } cout << sm << endl; return 0; }