int n, m; int fa[kMaxN], w[kMaxN], cnt[kMaxN]; int64_t sum[kMaxN], f[kMaxN]; std::string name[kMaxN]; std::vector<int> G[kMaxN]; std::map<int64_t, int> mp; std::priority_queue<std::pair<int64_t, int>, std::vector<std::pair<int64_t, int>>, std::greater<std::pair<int64_t, int>>> q;
voiddfs(int u){ int64_t minn = kInf; for (auto v : G[u]) { sum[v] = sum[u] + w[v]; dfs(v); minn = std::min(minn, f[v]); ++cnt[u]; } if (minn == kInf) f[u] = w[u]; else f[u] = minn + w[u]; }
voiddickdreamer(){ std::cin >> n >> m; for (int i = m + 1; i <= m + n; ++i) { std::cin >> name[i] >> fa[i] >> w[i]; G[fa[i]].emplace_back(i); } for (int i = 1; i <= m; ++i) { std::cin >> fa[i] >> w[i]; G[fa[i]].emplace_back(i); } dfs(0); for (int i = m + 1; i <= m + n; ++i) q.emplace(f[i], i); for (; !q.empty();) { auto [L, u] = q.top(); q.pop(); --cnt[fa[u]]; for (u = fa[u]; u && !cnt[u]; u = fa[u]) { if (L >= f[u]) { --cnt[fa[u]]; } else { q.emplace(f[u], u); break; } } mp[L] = q.size() + 1; } mp[kInf] = 0; for (int i = m + 1; i <= m + n; ++i) std::cout << name[i] << ' ' << prev(mp.upper_bound(sum[i]))->second << '\n'; }