Morass

LCA

Mar 26th, 2016
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.26 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <vector>
  4. #include <cmath>
  5. using namespace std;
  6. #define F(W) for(int i(0);i<W;++i)
  7. #define FT(I,W) for(int k(I);k<W;++k)
  8. #define FF(W) for(int j(0);j<W;++j)
  9. #define LS 12
  10. #define MX (1<<LS)
  11. vector<int> g[MX];
  12. int D[MX],P[MX][LS+1],N;
  13. void vnd(int u,int p,int d){
  14.     P[u][0]=p,D[u]=d++;
  15.     for(int i:g[u])if(i!=p)vnd(i,u,d);
  16. }
  17. void st(int r){
  18.     vnd(r,r,0);
  19.     F(LS)FF(N)P[j+1][i+1]=P[P[j+1][i]][i];
  20. }
  21. int parent(int a,int b){
  22.     if(D[a]>D[b])a^=b,b^=a,a^=b;
  23.     int d(D[b]-D[a]),s(0);
  24.     while(d)b=d&1?P[b][s]:b,d>>=1,++s;
  25.     for(int i(LS-1);~i;--i)
  26.         if(P[a][i]!=P[b][i])
  27.             a=P[a][i],b=P[b][i];
  28.     return a==b?a:P[a][0];
  29. }
  30. #define ADD(A,B) (g[A].push_back(B),++r[B])
  31. int tt,a,b,cc,m,r[MX];
  32. int root(void){
  33.     F(N)if(!r[i+1])return i+1;
  34.     return 666;
  35. }
  36. int main(void){
  37.     for(scanf("%d",&tt);tt--;){
  38.         memset(r,0,sizeof(r));
  39.         printf("Case %d:\n",++cc);
  40.         scanf("%d",&N);
  41.         F(N){
  42.             scanf("%d",&m);
  43.             FF(m)scanf("%d",&a),g[i+1].push_back(a),++r[a];
  44.         }
  45.         st(root());
  46.         scanf("%d",&m);
  47.         F(m)scanf("%d%d",&a,&b),printf("%d\n",parent(a,b));
  48.         for(auto &v:g)v.clear();
  49.     }
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment