sushmoyr

LCA by Rafid

Jun 22nd, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const int N = 100000 + 5;
  2. vector<int> g[N];
  3. int par[N], lev[N];
  4. int sp[N][20];      // sparse table. i's 2^j th parent in sp[i][j]
  5. int n;
  6.  
  7. void dfs(int u, int pr, int lv) {
  8.     par[u] = pr;
  9.     lev[u] = lv;
  10.     for(int i=0; i<(int) g[u].size(); ++i) {
  11.         int v = g[u][i];
  12.         if(v != pr) dfs(v, u, lv+1);
  13.     }
  14. }
  15.  
  16. void lca_init() {
  17.     dfs(1, -1, 0);
  18.     memset(sp, -1, sizeof sp);
  19.     for(int i=1; i<=n; ++i) sp[i][0] = par[i];
  20.  
  21.     for(int j=1; (1<<j) < n; ++j) {
  22.         for(int i=1; i<=n; ++i) {
  23.             if(sp[i][j-1] != -1) sp[i][j] = sp[sp[i][j-1]][j-1];
  24.         }
  25.     }
  26. }
  27.  
  28. int lca(int u, int v) {
  29.     if(lev[u] < lev[v]) swap(u, v);
  30.  
  31.     int logn = 0;
  32.     while((1 << (1+logn)) <= n) ++logn;
  33.     for(int i=logn; i>=0; --i) {
  34.         if(lev[u] - (1<<i) >= lev[v]) u = sp[u][i];
  35.     }
  36.     if(u == v) return u;
  37.  
  38.     for(int i=logn; i>=0; --i) {
  39.         if(sp[u][i] != -1 and sp[u][i] != sp[v][i]) {
  40.             u = sp[u][i];
  41.             v = sp[v][i];
  42.         }
  43.     }
  44.     return par[u];
  45. }
Add Comment
Please, Sign In to add comment