Advertisement
Anuiel

Untitled

Dec 9th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAXN = 3e5 + 10;
  6.  
  7. vector <int> sons[MAXN];
  8. vector < pair<int, int> > r[MAXN];
  9. int r_ans[MAXN];
  10. int parent[MAXN], ans[MAXN], sz[MAXN];
  11. bitset<MAXN> used;
  12.  
  13. void mergeLocal(vector <int> &a, vector <int> &b) {
  14. int s1 = a.size(), s2 = b.size();
  15. for (int i = 0; i < s2; i++) {
  16. a[s1 - (s2 - i)] += b[i];
  17. }
  18. }
  19.  
  20. int dfs(int v) {
  21. sz[v] = 1;
  22. for (auto &u : sons[v]) {
  23. sz[v] += dfs(u);
  24. }
  25. return sz[v];
  26. }
  27.  
  28. signed main() {
  29. freopen("input.txt", "r", stdin);
  30. int n;
  31. cin >> n;
  32. parent[1] = -1;
  33. for (int i = 2; i <= n; i++) {
  34. int v;
  35. cin >> v;
  36. parent[i] = v;
  37. sons[v].push_back(i);
  38. }
  39. int lists = 0;
  40. for (int i = 1; i <= n; i++) {
  41. if (sons[i].size() == 0) {
  42. lists++;
  43. }
  44. }
  45. vector <int> ans_v[lists];
  46. int a = 0;
  47. for (int i = 1; i <= n; i++) {
  48. if (sons[i].size() == 0) {
  49. ans[i] = a++;
  50. ans_v[ans[i]].push_back(1);
  51. }
  52. }
  53. int root = 1;
  54. dfs(root);
  55. int q;
  56. cin >> q;
  57. for (int i = 0; i < q; i++) {
  58. int v, h;
  59. cin >> v >> h;
  60. r[v].push_back(make_pair(h, i));
  61. }
  62. deque <int> d;
  63. for (int i = 1; i <= n; i++) {
  64. if (sons[i].size() == 0) {
  65. d.push_back(i);
  66. }
  67. }
  68. while (!d.empty()) {
  69. int v = d.front();
  70. d.pop_front();
  71. int mx = -1;
  72. for (auto &u : sons[v]) {
  73. if (mx == -1 || sz[u] > sz[mx]) {
  74. mx = u;
  75. }
  76. }
  77. if (mx != -1) {
  78. ans[v] = ans[mx];
  79. for (auto &u : sons[v]) {
  80. if (u != mx) {
  81. mergeLocal(ans_v[ans[v]], ans_v[ans[u]]);
  82. }
  83. }
  84. ans_v[ans[v]].push_back(1);
  85. }
  86. for (auto &p : r[v]) {
  87. int h = p.first, id = p.second;
  88. if (h >= ans_v[ans[v]].size()) {
  89. r_ans[id] = 0;
  90. } else {
  91. r_ans[id] = ans_v[ans[v]][ans_v[ans[v]].size() - h - 1];
  92. }
  93. }
  94. if (parent[v] != -1 && !used[parent[v]]) {
  95. d.push_back(parent[v]);
  96. used[parent[v]] = true;
  97. }
  98. }
  99. for (int i = 0; i < q; i++) {
  100. cout << r_ans[i] << " ";
  101. }
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement