willy108

nth root lca

Mar 17th, 2021 (edited)
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.00 KB | None | 0 0
  1. const int max_v = ;
  2. const int RT = , LOG = ; //RT^LOG approx max_v
  3. vector<int> adj[max_v];
  4. int super[max_v][LOG * 2], par[max_v], dep[max_v], base[max_v], n, q;
  5.  
  6. void dfs(int u, int p, int d){ //general util dfs
  7.   par[u] = super[u][0] = p;
  8.   dep[u] = d;
  9.   for(int v : adj[u])
  10.     if(v != p)
  11.        dfs(v, u, d + 1);
  12. }
  13.  
  14. void precomp(){
  15.   base[0] = 1;
  16.   for(int k = 1; k<=LOG; k++){
  17.     base[k] = base[k - 1] * RT;
  18.     for(int i = 1, j; i<=n; i++){
  19.       for(j = 0, super[i][k] = i; j < RT && super[i][k]; j++){
  20.         super[i][k] = super[super[i][k]][k - 1];
  21.       }
  22.     }
  23.   }
  24. }
  25.  
  26. int k_up(int u, int k){
  27.   for(int i = LOG; i >= 0; i--){
  28.     while(k >= base[i])k -= base[i], u = super[u][i];
  29.   }
  30.   return u;
  31. }
  32.  
  33. int LCA(int u, int v){
  34.   if(dep[u] < dep[v]) swap(u, v);
  35.   u = k_up(u, dep[u] - dep[v]);
  36.   if(u == v) return u;
  37.   for(int i = LOG; i >= 0; i--){
  38.     while(super[u][i] != super[v][i]) u = super[u][i], v = super[v][i];
  39.   }
  40.   return (par[u]) ? par[u] : u; //cant return 0
  41. }
  42.  
Add Comment
Please, Sign In to add comment