Advertisement
willy108

Cube Root Decomp

Dec 26th, 2020
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.89 KB | None | 0 0
  1. list<int> adj[max_v];
  2. int par[max_v], dep[max_v], sup[max_v], dup[max_v];
  3. int n, q;
  4. void dfs(int u, int p, int d){
  5.  
  6.   par[u] = p;
  7.   dep[u] = d;
  8.   for(int v : adj[u])
  9.     if(v != p)
  10.       dfs(v, u, d + 1);    
  11. }
  12.  
  13. void precomp(){
  14.   for(int i = 1, j; i<=n; i++)
  15.     for(j = 0, sup[i] = i; sup[i] && j < CUBE; j++) sup[i] = par[sup[i]];
  16.   for(int i = 1, j; i<=n; i++)
  17.     for(j = 0, dup[i] = i; dup[i] && j < CUBE; j++) dup[i] = sup[dup[i]];
  18. }
  19.  
  20. int k_up(int u, int k){
  21.   for(; k >= CUBE * CUBE; k -= CUBE * CUBE) u = dup[u];
  22.   for(; k >= CUBE; k -= CUBE) u = sup[u];
  23.   for(; k; k--) u = par[u];
  24.   return u;
  25. }
  26.  
  27. int lca(int u, int v){
  28.   if(dep[u] < dep[v]) swap(u, v);
  29.   u = k_up(u, dep[u] - dep[v]);
  30.   while(dup[u] != dup[v]) u = dup[u], v = dup[v];
  31.   while(sup[u] != sup[v]) u = sup[u], v = sup[v];
  32.   while(u != v) u = par[u], v = par[v];
  33.   assert(u == v && v);
  34.   return u;
  35. }
  36.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement