from collections import defaultdict def count_interesting_triplets(n, k, scores, parent): adj = defaultdict(list) for i in range(1, n): adj[parent[i]].append(i) max_score = [float('-inf')] * n max2_score = [float('-inf')] * n cnt = [0] * n def dfs(node): nonlocal cnt max_desc = max2_desc = float('-inf') for child in adj[node]: dfs(child) if max_score[child] > max_desc: max2_desc = max_desc max_desc = max_score[child] elif max_score[child] > max2_desc: max2_desc = max_score[child] cnt[node] += cnt[child] max_score[node] = scores[node-1] max2_score[node] = float('-inf') if max_desc > float('-inf'): max2_score[node] = max(max2_score[node], max2_desc) if max_score[node] > max_desc: max2_score[node] = max(max2_score[node], max_desc) max_desc, max_score[node] = max_score[node], max_desc elif max_score[node] > max2_desc: max2_score[node] = max(max2_score[node], max2_desc) for child in adj[node]: if max_score[child] < max_score[node] * k and \ max2_score[child] < max_score[node] * k: cnt[node] += cnt[child] * (cnt[node] - cnt[child] - 1) dfs(0) return cnt[0] t = int(input()) for i in range(1, t+1): n, k = map(int, input().split()) scores = list(map(int, input().split())) parent = [0] + list(map(int, input().split())) cnt = count_interesting_triplets(n, k, scores, parent) print(f"Case #{i}: {cnt}")