#include <bits/stdc++.h>
using namespace std;

int main ()
{
	int n, k;
	cin >> n >> k;
	vector <vector <int> > adj (n);
	vector <int> weight (n);
	int root = -1;
	for (int j = 0; j < n; j++)
	{
		int p;
		cin >> p >> weight[j];
		if (p == 0)
		{
			root = j;
		}
		else
		{
			p -= 1;
			adj[j].push_back (p);
			adj[p].push_back (j);
		}
	}

	vector <vector <int> > f (n, vector <int> (2, 0));

	function <void (int, int)> recur = [&] (int v, int p)
	{
		f[v][1] = weight[v];
		f[v][0] = 0;
		vector <int> delta;
		for (auto u : adj[v])
		{
			if (u == p) continue;
			recur (u, v);
			f[v][1] += f[u][0];
			f[v][0] += f[u][0];
			delta.push_back (f[u][1] - f[u][0]);
		}
		sort (delta.rbegin (), delta.rend ());
		for (int i = 0; i < k; i++)
		{
			if (int (delta.size ()) <= i || delta[i] <= 0) break;
			f[v][0] += delta[i];
		}
	};

	recur (root, -1);
	cout << max (f[root][0], f[root][1]) << endl;
	return 0;
}
