Guest User

Untitled

a guest
Jun 24th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.23 KB | None | 0 0
  1. // LCA using Segment Tree
  2. // by Lawrence Melo
  3.  
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. const int maxn = 50100;
  7.  
  8. vector<int> G[maxn];
  9. int cam[4*maxn], tree[4*maxn], d[maxn], num, f[maxn];
  10. bool vis[maxn];
  11.  
  12.  
  13. void euler(int x, int y) // euler tour
  14. {
  15. f[x] = ++num;
  16. cam[num] = x;
  17. d[x] = d[y] + 1;
  18. for(auto u : G[x])
  19. {
  20. if(u == y) continue;
  21. euler(u, x);
  22. cam[++num] = x;
  23. }
  24. }
  25.  
  26. int op(int a, int b)
  27. {
  28. if(d[a] < d[b]) return a;
  29. else return b;
  30. }
  31.  
  32. void build(int no, int l , int r)
  33. {
  34. if(l == r)
  35. tree[no] = cam[l];
  36. else
  37. {
  38. int m = (l + r) / 2;
  39. build(2*no, l , m);
  40. build(2*no + 1, m + 1, r);
  41. tree[no] = op(tree[2*no], tree[2*no + 1]);
  42. }
  43. }
  44.  
  45. int query(int no, int l, int r, int a , int b)
  46. {
  47. if(a <= l and r <= b)
  48. return tree[no];
  49. int m = (l + r) / 2;
  50.  
  51. if(b <= m) return query(2*no, l , m, a , b);
  52. if(a > m) return query(2*no + 1, m + 1, r, a, b);
  53.  
  54. return op(query(2*no, l , m, a , b), query(2*no + 1, m + 1, r, a , b));
  55. }
  56.  
  57. int LCA(int a , int b)
  58. {
  59. if(f[a] > f[b]) swap(a, b);
  60. return query(1, 1, num, f[a], f[b]);
  61. }
  62.  
  63.  
  64. int n;
  65.  
  66. int main()
  67. {
  68. ios::sync_with_stdio(false), cin.tie(0);
  69. cin >> n;
  70.  
  71. for(int i = 0; i < n - 1; i++)
  72. {
  73. int a , b;
  74. cin >> a >> b;
  75. G[a].push_back(b);
  76. G[b].push_back(a);
  77. }
  78. euler(1, 1);
  79.  
  80. build(1, 1, num);
  81.  
  82. }
Add Comment
Please, Sign In to add comment