AlexNeagu11

1 - Trees and Queries

Feb 11th, 2022
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int nax = 100005;
  4.  
  5. vector<int> adj[nax];
  6. int logaritm[2 * nax];
  7.  
  8. vector<pair<int,int>> euler;
  9. vector<int> first(nax);
  10. vector<vector<int>> rmq(nax * 2, vector<int> (20, 0));
  11. vector<int> depth(nax);
  12.  
  13. void dfs(int node, int prd, int lvl) {
  14. first[node] = euler.size();
  15. euler.push_back({node, lvl});
  16. depth[node] = lvl;
  17. for(auto it : adj[node]) {
  18. if(it == prd) {
  19. continue;
  20. }
  21. dfs(it, node, lvl + 1);
  22. euler.push_back({node, lvl});
  23. }
  24. }
  25.  
  26. void computeMins() {
  27. int n = euler.size();
  28. for(int i = 0; i < n; ++i) {
  29. rmq[i][0] = i;
  30. }
  31. for(int i = 1; (1 << i) <= n; ++i) {
  32. for(int j = 0; j + (1 << i) - 1 < n; ++j) {
  33. int k = rmq[j][i - 1];
  34. int l = rmq[j + (1 << (i - 1))][i - 1];
  35. if(euler[k].second < euler[l].second) {
  36. rmq[j][i] = k;
  37. } else {
  38. rmq[j][i] = l;
  39. }
  40. }
  41. }
  42. }
  43. int findLCA(int x, int y) {
  44.  
  45. x = first[x];
  46. y = first[y];
  47.  
  48. if(x > y) {
  49. swap(x, y);
  50. }
  51. int len = logaritm[y - x + 1];
  52. int k = rmq[x][len];
  53. int l = rmq[y - (1 << len) + 1][len];
  54. if(euler[k].second < euler[l].second) {
  55. return euler[k].first;
  56. }
  57. return euler[l].first;
  58. }
  59.  
  60. int dist(int x, int y) {
  61. int lca = findLCA(x, y);
  62. return depth[x] + depth[y] - 2 * depth[lca];
  63. }
  64.  
  65. int main() {
  66. ios_base::sync_with_stdio(false);
  67. cin.tie(0);
  68.  
  69. logaritm[1] = 0;
  70. for(int i = 2; i < 2 * nax; i++) {
  71. logaritm[i] = logaritm[i / 2] + 1;
  72. }
  73.  
  74. int n;
  75. cin >> n;
  76.  
  77. for(int i = 2; i <= n; ++i) {
  78. int x, y;
  79. cin >> x >> y;
  80. adj[x].push_back(y);
  81. adj[y].push_back(x);
  82. }
  83.  
  84. dfs(1, 0, 0);
  85. computeMins();
  86.  
  87. int m;
  88. cin >> m;
  89. for(int i = 1; i <= m; ++i) {
  90.  
  91. int x, y, a, b, k, lca;
  92. cin >> x >> y >> a >> b >> k;
  93. int dist1 = dist(a, b);
  94. int dist2 = dist(a, x) + 1 + dist(y, b);
  95. dist2 = min(dist2, dist(a, y) + 1 + dist(x, b));
  96. if(dist1 <= k && dist1 % 2 == k % 2) {
  97. cout << "YES\n";
  98. continue;
  99. }
  100. if(dist2 <= k && dist2 % 2 == k % 2) {
  101. cout << "YES\n";
  102. continue;
  103. }
  104. cout << "NO\n";
  105. }
  106.  
  107. return 0;
  108. }
  109.  
  110.  
  111.  
  112.  
  113.  
Advertisement
Add Comment
Please, Sign In to add comment