DuongNhi99

GUIDE

Nov 30th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4.  
  5. const int N = 2e5 + 5;
  6. const int M = log2(N) + 1;
  7.  
  8. int n, l;
  9. vector<int> a[N];
  10.  
  11. int timer;
  12. int t_in[N], t_out[N];
  13. int up[N][M];
  14.  
  15. void DFS(int v, int p) {
  16.     t_in[v] = ++timer;
  17.     up[v][0] = p;
  18.  
  19.     for(int i = 1; i <= l; ++i)
  20.         up[v][i] = up[up[v][i-1]][i-1];
  21.  
  22.     for(int u : a[v])
  23.         if(u != p) DFS(u, v);
  24.     t_out[v] = ++ timer;
  25. }
  26.  
  27. bool is_ancestor(int u, int v) {
  28.     return t_in[u] <= t_in[v] && t_out[u] >= t_out[v];
  29. }
  30.  
  31. int LCA(int u, int v) {
  32.     if(is_ancestor(u, v)) return u;
  33.     if(is_ancestor(v, u)) return v;
  34.  
  35.     for(int i = l; i >= 0; --i)
  36.         if(!is_ancestor(up[u][i], v))
  37.             u = up[u][i];
  38.  
  39.     return up[u][0];
  40. }
  41.  
  42. int main()
  43. {
  44.     freopen("GUIDE.inp", "r", stdin);
  45.     freopen("GUIDE.out", "w", stdout);
  46.     ios_base::sync_with_stdio(false);
  47.     cin.tie(NULL); cout.tie(NULL);
  48.  
  49.     cin >> n;
  50.     for(int i = 1; i <= n-1; ++i){
  51.         int u, v; cin >> u >> v;
  52.         a[u].push_back(v);
  53.         a[v].push_back(u);
  54.     }
  55.     timer = 0;
  56.     l = log2(n);
  57.     DFS(1, 1);
  58.  
  59.     int t; cin >> t;
  60.     while(t--) {
  61.         int u, v; cin >> u >> v;
  62.  
  63.         int lca = LCA(u, v);
  64.  
  65.         if(u != lca)
  66.             cout << up[u][0] << '\n';
  67.         else {
  68.             for(int i = l; i >= 0; --i) {
  69.                 if(up[v][i] == 0) continue;
  70.  
  71.                 if(!is_ancestor(up[v][i], u))
  72.                     v = up[v][i];
  73.             }
  74.  
  75.             cout << v << '\n';
  76.         }
  77.     }
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment