Advertisement
nullzero

LCA

Apr 23rd, 2013
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <cassert>
  4.  
  5. int p[LOG][MAXN];
  6. vector<int> adj[MAXN];
  7. int level[MAXN];
  8. int _level;
  9.  
  10. void dfs(int node){
  11.     ...
  12.     level[node] = _level;
  13.     _level++;
  14.     ...
  15.     for(...){
  16.     }
  17.     _level--;
  18. }
  19.  
  20. int main(){
  21.     int n, m;
  22.     scanf("%d", &n);
  23.     for(int i = 1; i <= n; ++i){
  24.         int val;
  25.         scanf("%d", &val);
  26.         p[0][i] = val;         // parent (level 0)
  27.         adj[val].push_back(i); // adjacency list
  28.     }
  29.     // fill level, suppose root is 1
  30.     dfs(1);
  31.    
  32.     // preprocess
  33.     for(int i = 1; i < LOG; ++i)
  34.         for(int j = 1; j <= n; ++j)
  35.             p[i][j] = p[i - 1][p[i - 1][j]];
  36.    
  37.     int q;
  38.     scanf("%d", &q);
  39.     while(q--){
  40.         int a, b;
  41.         scanf("%d %d", &a, &b);
  42.         // query
  43.         if(level[a] > level[b]) swap(a, b); // lev[a] will be less than lev[b]
  44.         for(int i = LOG - 1; i >= 0; --i)
  45.             if(level[p[i][b]] >= leval[a])
  46.                 b = p[i][b];
  47.         assert(level[a] == level[b]); // now lev[a] == lev[b] for sure.
  48.         for(int i = LOG - 1; i >= 0; --i)
  49.             if(level[p[i][b]] != level[p[i][a]]){
  50.                 a = p[i][a];
  51.                 b = p[i][b];
  52.             }
  53.         assert(a == b); // now a == b
  54.         printf("%d\n", a);
  55.     }
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement