intLCA(int u,int v) { if(deg[u] > deg[v])swap(u,v); int u1 = deg[u], v1 = deg[v]; int u2 = u, v2 = v; int det = v1-u1; for( int i = 0 ;(1<<i)<=det;i++) if((1<<i)&det) v2 = fa[v2][i]; if(u2 == v2)return u2; for(int i = DEG-1; i >= 0; i--) //从最大祖先开始,判断a,b祖先,是否相同 { if(fa[u2][i] == fa[v2][i]) continue; u2 = fa[u2][i]; //如不相同,a b同时向上移动2^j v2 = fa[v2][i]; } return fa[u2][0]; } voidinit(){ tot = 0; memset(head,-1,sizeof(head)); } intmain() { ios::sync_with_stdio(false); while(scanf("%d",&n)!=EOF){ init(); for( int i = 1 ; i < n ; ++i ) { int u , v ; cin>>u>>v; add( u , v ) ; add( v , u ) ; } dfs(1); F(); int q ; cin>>q; while( q-- ) { int x , y ; scanf("%d%d",&x,&y); // cin>>x>>y; cout<<LCA(x,y)<<endl; } } return0; }