fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. vector<int> childs[100005];
  5. int dep = 0;
  6. int ans[100005], val[100005], anak[100005], potong[100005];
  7. void traverse(int now) {
  8. for(int i = 0; i < childs[now].size(); i++) {
  9. traverse(childs[now][i]);
  10. potong[now]+=potong[childs[now][i]];
  11. anak[now]+=anak[childs[now][i]];
  12. }
  13. anak[now]++;
  14. potong[now]+=val[now];
  15. ans[anak[now]] = max(ans[anak[now]], potong[now]);
  16. }
  17.  
  18. int main() {
  19. int n;
  20. scanf("%d", &n);
  21. memset(ans,0,sizeof ans);
  22. memset(anak,0,sizeof anak);
  23. memset(val,0,sizeof val);
  24. memset(potong,0,sizeof potong);
  25. for(int i = 1; i<n; i++) {
  26. int x,y;
  27. scanf("%d %d", &x, &y);
  28. childs[x].push_back(i);
  29. val[i] = y;
  30. }
  31. traverse(0);
  32. int q;
  33. scanf("%d", &q);
  34. for(int i = 1; i<=q ; i++) {
  35. int k;
  36. scanf("%d", &k);
  37. if(ans[k]) printf("%d\n", ans[k]);
  38. else printf("-1\n");
  39. }
  40.  
  41. return 0;
  42. }
Success #stdin #stdout 0s 19144KB
stdin
6
0 5
1 3
2 4
2 2
2 3
5
1
2
3
4
5
stdout
4
-1
-1
12
17