Ukh1

Fenwick tree lca

Oct 14th, 2025
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using ll = long long;
  5.  
  6. int const nmax = 200000;
  7. int parent[1 + nmax];
  8. int fen[1 + nmax];
  9. int level[1 + nmax];
  10. inline int LSB(int x) {
  11.     return x &-x;
  12. }
  13.  
  14. inline int anc(int node, int k) {
  15.     int r = level[node];
  16.     int l = r - k;
  17.     if (l < 1)return -1;
  18.     while (l < r) {
  19.       int nr = r - LSB(r);
  20.       bool exceed = nr < l;
  21.       node = exceed ? parent[node] : fen[node];
  22.       r = exceed ? r - 1 : nr;
  23.     }
  24.     return node;
  25. }
  26.  
  27. inline int lca(int a, int b) {
  28.     if (level[a]>level[b]) {
  29.         std::swap(a,b);
  30.     }
  31.     b=anc(b,level[b]-level[a]);
  32.     int r=level[a];
  33.     while(a!=b) {
  34.         if (fen[a]==fen[b]){
  35.             r--;
  36.             a=parent[a];
  37.             b=parent[b];
  38.         } else {
  39.             r-=r&-r;
  40.             a=fen[a];
  41.             b=fen[b];
  42.         }
  43.     }
  44.     return a;
  45. }
  46.  
  47. int main() {
  48.   int n, q;
  49.   std::cin >> n >> q;
  50.   for(int i = 2; i <= n; i++)
  51.     std::cin >> parent[i];
  52.   level[1] = 1;
  53.   for(int i = 2; i <= n; i++) {
  54.     level[i] = level[parent[i]] + 1;
  55.     int sz=LSB(level[i]);
  56.     int p=parent[i];
  57.     while(sz>>=1){
  58.         p=fen[p];
  59.     }
  60.     fen[i]=p;
  61.   }
  62.  
  63.   while(q--) {
  64.     int a, b;
  65.     std::cin >> a >> b;
  66.  
  67.     std::cout << lca(a, b) << '\n';
  68.   }
  69.   return 0;
  70. }
  71.  
Advertisement
Add Comment
Please, Sign In to add comment