# d103 ```cpp= #include <stdio.h> #include <unordered_map> #include <unordered_set> #include <utility> using namespace std; pair<int, int> findMax(int cur, unordered_map<int, unordered_map<int, int>>& edges) { int maxLayers = 0, maxDist = 0; for (auto it = edges[cur].begin(); it != edges[cur].end(); it++) { int to = it->first; int w = it->second; if (edges[to].find(cur) != edges[to].end()) { edges[to].erase(cur); } pair<int, int> result = findMax(to, edges); if (result.first + w > maxDist) { maxDist = result.first + w; } if (result.second + 1 > maxLayers) { maxLayers = result.second + 1; } } return pair<int, int>(maxDist, maxLayers); } int main() { unordered_map<int, unordered_map<int, int>> edges; int n; scanf("%d", &n); for (int i = 1; i <= n - 1; i++) { int x, w; scanf("%d%d", &x, & w); edges[i].insert({{x, w}}); edges[x].insert({{i, w}}); } pair<int, int> ans = findMax(0, edges); printf("%d\n%d\n", ans.first, ans.second); return 0; } ```