tien_noob

LCA

Apr 27th, 2021 (edited)
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define TASK "LCA"
  3. using namespace std;
  4. const int N = 5e5;
  5. int n, q, par[N+1], P[21][N+1], LG[N+1], depth[N+1];
  6. vector<int> Adj[N+1];
  7. void DFS(int u, int p)
  8. {
  9.     for (int v : Adj[u])
  10.     {
  11.         if (v == p)
  12.         {
  13.             continue;
  14.         }
  15.         P[0][v] = u;
  16.         for (int k = 1; k <= LG[n]; ++ k)
  17.         {
  18.             P[k][v] = P[k-1][P[k-1][v]];
  19.         }
  20.         depth[v] = depth[u] + 1;
  21.         DFS(v, u);
  22.     }
  23. }
  24. void read()
  25. {
  26.    cin >> n >> q;
  27.    LG[1] = 0;
  28.    for (int i = 2; i <= N; ++ i)
  29.    {
  30.        LG[i] = LG[i/2] + 1;
  31.    }
  32.    for (int i = 1; i < n; ++ i)
  33.    {
  34.        cin >> par[i];
  35.        Adj[par[i]].push_back(i);
  36.    }
  37.    DFS(0,0);
  38. }
  39. int LCA(int u, int v)
  40. {
  41.    if (depth[u] < depth[v])
  42.    {
  43.        swap(u, v);
  44.    }
  45.    int k = depth[u] - depth[v];
  46.    for (int i = 0; i <= LG[n]; ++ i)
  47.    {
  48.        if (k & (1 << i))
  49.        {
  50.            u = P[i][u];
  51.        }
  52.    }
  53.    if (u == v)
  54.    {
  55.        return u;
  56.    }
  57.    for (int i = LG[n]; i >= 0; -- i)
  58.    {
  59.        if (P[i][u] != P[i][v])
  60.        {
  61.            u = P[i][u];
  62.            v = P[i][v];
  63.        }
  64.    }
  65.    return P[0][u];
  66. }
  67. void solve()
  68. {
  69.    while(q--)
  70.    {
  71.        int u, v;
  72.        cin >> u >> v;
  73.        cout << LCA(u, v) << '\n';
  74.    }
  75. }
  76.  
  77. int main()
  78. {
  79.    ios_base::sync_with_stdio(false);
  80.    cin.tie(nullptr);
  81.    //freopen(TASK".INP", "r", stdin);
  82.    //freopen(TASK".OUT", "w", stdout);
  83.    read();
  84.    solve();
  85. }
  86.  
Add Comment
Please, Sign In to add comment