static void Main(String[] args) { string[] strs; strs = Console.ReadLine().Split(' '); var n = int.Parse(strs[0]); var t = int.Parse(strs[1]); var children = new List<int>[n + 1]; var hasParent = new bool[n + 1]; for (var i = 1; i < n; ++i) { strs = Console.ReadLine().Split(' '); var parent = int.Parse(strs[0]); var child = int.Parse(strs[1]); if (children[parent] == null) { children[parent] = new List<int>(); } children[parent].Add(child); hasParent[child] = true; } int root = 0; for (var i = 1; i <= n; ++i) { if (!hasParent[i]) { root = i; break; } } long result = 0; var visitedNodes = new CountTree(1, n); visitedNodes.Add(root); var stack = new Stack<StackElement>(); stack.Push(new StackElement { Lable = root, CurrentChildIndex = 0 }); while (stack.Count > 0) { var node = stack.Peek(); var childrenCount = children[node.Lable] == null ? 0 : children[node.Lable].Count; if (node.CurrentChildIndex >= childrenCount) { visitedNodes.Remove(node.Lable); stack.Pop(); } else { var nextNode = children[node.Lable][node.CurrentChildIndex]; var lower = nextNode - t; var upper = nextNode + t; result += visitedNodes.GetCountLessThanOrEqualTo(upper) - visitedNodes.GetCountLessThanOrEqualTo(lower - 1); ++node.CurrentChildIndex; visitedNodes.Add(nextNode); stack.Push(new StackElement { Lable = nextNode, CurrentChildIndex = 0 }); } } Console.WriteLine(result); }