Alex_tz307

LCA binary lifting

Nov 26th, 2020 (edited)
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 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. const int lg = 20;
  9. vector < vector < int > > G, ancestor;
  10. vector < int > level;
  11.  
  12. void dfs(int node, int parent) {
  13.     ancestor[node][0] = parent;
  14.     for(int i = 1; i <= lg; ++i)
  15.         ancestor[node][i] = ancestor[ancestor[node][i - 1]][i - 1];
  16.     for(int next : G[node])
  17.         if(next != parent) {
  18.             level[next] = level[node] + 1;
  19.             dfs(next, node);
  20.         }
  21. }
  22.  
  23. int lca(int u, int v) {
  24.     if(level[u] < level[v])
  25.         swap(u, v);
  26.     for(int i = lg; i >= 0; --i)
  27.         if(level[u] - (1 << i) >= level[v])
  28.             u = ancestor[u][i];
  29.     if(u == v)
  30.         return u;
  31.     for(int i = lg; i >= 0; --i)
  32.         if(ancestor[u][i] != ancestor[v][i]) {
  33.             u = ancestor[u][i];
  34.             v = ancestor[v][i];
  35.         }
  36.     return ancestor[u][0];
  37. }
  38.  
  39. int main() {
  40.     int N, Q;
  41.     fin >> N >> Q;
  42.     G.resize(N + 1);
  43.     for(int i = 2; i <= N; ++i) {
  44.         int parent;
  45.         fin >> parent;
  46.         G[parent].emplace_back(i);
  47.     }
  48.     ancestor = vector < vector < int > >(N + 1, vector < int >(lg + 1));
  49.     level.resize(N + 1);
  50.     dfs(1, 0);
  51.     while(Q--) {
  52.         int u, v;
  53.         fin >> u >> v;
  54.         fout << lca(u, v) << '\n';
  55.     }
  56. }
  57.  
Advertisement
Add Comment
Please, Sign In to add comment