Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <vector>
- #include <cmath>
- using namespace std;
- #define F(W) for(int i(0);i<W;++i)
- #define FT(I,W) for(int k(I);k<W;++k)
- #define FF(W) for(int j(0);j<W;++j)
- #define LS 12
- #define MX (1<<LS)
- vector<int> g[MX];
- int D[MX],P[MX][LS+1],N;
- void vnd(int u,int p,int d){
- P[u][0]=p,D[u]=d++;
- for(int i:g[u])if(i!=p)vnd(i,u,d);
- }
- void st(int r){
- vnd(r,r,0);
- F(LS)FF(N)P[j+1][i+1]=P[P[j+1][i]][i];
- }
- int parent(int a,int b){
- if(D[a]>D[b])a^=b,b^=a,a^=b;
- int d(D[b]-D[a]),s(0);
- while(d)b=d&1?P[b][s]:b,d>>=1,++s;
- for(int i(LS-1);~i;--i)
- if(P[a][i]!=P[b][i])
- a=P[a][i],b=P[b][i];
- return a==b?a:P[a][0];
- }
- #define ADD(A,B) (g[A].push_back(B),++r[B])
- int tt,a,b,cc,m,r[MX];
- int root(void){
- F(N)if(!r[i+1])return i+1;
- return 666;
- }
- int main(void){
- for(scanf("%d",&tt);tt--;){
- memset(r,0,sizeof(r));
- printf("Case %d:\n",++cc);
- scanf("%d",&N);
- F(N){
- scanf("%d",&m);
- FF(m)scanf("%d",&a),g[i+1].push_back(a),++r[a];
- }
- st(root());
- scanf("%d",&m);
- F(m)scanf("%d%d",&a,&b),printf("%d\n",parent(a,b));
- for(auto &v:g)v.clear();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment