Alex_tz307

LCA

Oct 16th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("lca.in");
  6. ofstream fout("lca.out");
  7.  
  8. int K, N, Q;
  9. vector < vector < int > > Graph;
  10. vector < int > Euler, lg, first, Level, rmq[18];
  11.  
  12. void DFS(int node, int level) {
  13.     Euler[++K] = node;
  14.     Level[K] = level;
  15.     first[node] = K;
  16.     for(int next : Graph[node]) {
  17.         DFS(next, level + 1);
  18.         Euler[++K] = node;
  19.         Level[K] = level;
  20.     }
  21. }
  22.  
  23. void RMQ() {
  24.     for(int i = 2; i <= K; ++i)
  25.         lg[i] = lg[i >> 1] + 1;
  26.     for(int i = 1; i <= K; ++i)
  27.         rmq[0][i] = i;
  28.     for(int i = 1; (1 << i) < K; ++i)
  29.         for(int j = 1; j <= K - (1 << i); ++j) {
  30.             int l = 1 << (i - 1);
  31.             rmq[i][j] = rmq[i - 1][j];
  32.             if(Level[rmq[i - 1][j + l]] < Level[rmq[i][j]])
  33.                 rmq[i][j] = rmq[i - 1][j + l];
  34.         }
  35. }
  36.  
  37. int LCA(int u, int v) {
  38.     int x = first[u], y = first[v];
  39.     if(x > y)
  40.         swap(x, y);
  41.     int diff = y - x + 1,
  42.         l = lg[diff],
  43.         sol = rmq[l][x],
  44.         sh = diff - (1 << l);
  45.     if(Level[sol] > Level[rmq[l][x + sh]])
  46.         sol = rmq[l][x + sh];
  47.     return Euler[sol];
  48. }
  49.  
  50. int main() {
  51.     fin.sync_with_stdio(false);
  52.     fout.sync_with_stdio(false);
  53.     fin.tie(nullptr);
  54.     fout.tie(nullptr);
  55.     fin >> N >> Q;
  56.     Graph.resize(N + 1);
  57.     first.resize(N + 1);
  58.     Euler.resize((N << 1) + 1);
  59.     lg.resize((N << 1) + 1);
  60.     Level.resize((N << 1) + 1);
  61.     for(int i = 0; i < 18; ++i)
  62.         rmq[i].resize((N << 1) + 1);
  63.     for(int i = 2; i <= N; ++i) {
  64.         int x;
  65.         fin >> x;
  66.         Graph[x].emplace_back(i);
  67.     }
  68.     DFS(1, 0);
  69.     RMQ();
  70.     while(Q--) {
  71.         int u, v;
  72.         fin >> u >> v;
  73.         fout << LCA(u, v) << '\n';
  74.     }
  75. }
  76.  
Advertisement
Add Comment
Please, Sign In to add comment