Advertisement
randykaur

Day1 - LCA+segTree.cpp

Jul 23rd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. const int MAXN = 1e5 + 1;
  6. const int INF = 1e9;
  7.  
  8. pair <int, int> st[8 * MAXN];
  9. int h[MAXN], pos[MAXN];
  10. vector <int> dfsorder;
  11.  
  12. void build (int id, int l, int r) {
  13. if (l == r) {
  14. st[id] = make_pair (h[dfsorder[l]], dfsorder[l]);
  15. return;
  16. }
  17.  
  18. int mid = (l + r) / 2;
  19. build (id * 2, l, mid);
  20. build (id * 2 + 1, mid + 1, r);
  21.  
  22. st[id] = min (st[id * 2], st[id * 2 + 1]);
  23.  
  24. return;
  25. }
  26.  
  27. pair <int, int> query (int id, int l, int r, int ll, int rr) {
  28. if (ll <= l && r <= rr) return st[id];
  29. if (r < ll || rr < l) {
  30. return make_pair (INF, -1);
  31. }
  32.  
  33. int mid = (l + r) / 2;
  34. return min (query (id * 2, l, mid, ll, rr),
  35. query (id * 2 + 1, mid + 1, r, ll, rr));
  36. }
  37.  
  38. vector <int> g[MAXN];
  39.  
  40. void dfs (int x, int pai) {
  41. pos[x] = dfsorder.size();
  42. dfsorder.push_back (x);
  43.  
  44. for (int i = 0; i < g[x].size(); ++i) {
  45. int y = g[x][i];
  46. if (y == pai) continue;
  47.  
  48. h[y] = h[x] + 1;
  49. dfs (y, x);
  50.  
  51. dfsorder.push_back (x);
  52. }
  53. }
  54.  
  55. int main () {
  56.  
  57. int n;
  58. cin >> n;
  59.  
  60. for (int i = 1; i < n; ++i) {
  61. int a, b;
  62. cin >> a >> b;
  63. g[a].push_back (b);
  64. g[b].push_back (a);
  65. }
  66.  
  67. h[0] = 0;
  68. dfs (0, -1);
  69.  
  70. build (1, 0, dfsorder.size() - 1);
  71.  
  72. int q;
  73. cin >> q;
  74.  
  75. for (int i = 0; i < q; ++i) {
  76. int a, b;
  77. cin >> a >> b;
  78.  
  79. cout << "LCA de " << a << " e " << b << " = ";
  80.  
  81. a--; b--;
  82.  
  83. if (pos[a] < pos[b])
  84. cout << query (1, 0, dfsorder.size() - 1, pos[a],
  85. pos[b]).second << endl;
  86. else
  87. cout << query (1, 0, dfsorder.size() - 1, pos[b],
  88. pos[a]).second << endl;
  89.  
  90. }
  91.  
  92.  
  93.  
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement