1 #include <cstdio>
2 #include <iostream>
3 #include <algorithm>
4 #include <cstring>
5 using namespace std;
6 const int maxn = 1e6 + 5;
7 struct node
8 {
9 int u , v , next;
10 }G[maxn];
11 int tail , head[maxn];
12 int n , m , s;
13 int depth[maxn] , father[maxn][25] , lg[maxn];
14 void add(int u , int v)
15 {
16 tail++;
17 G[tail].u = u , G[tail].v = v , G[tail].next = head[u];
18 head[u] = tail;
19 }
20 void dfs(int p , int fa)
21 {
22 depth[p] = depth[fa] + 1;
23 father[p][0] = fa;
24 for(int i = 1; (1 << i) <= depth[p]; i++)
25 father[p][i] = father[father[p][i - 1]][i - 1];
26 for(int i = head[p]; i ; i = G[i].next)
27 if(G[i].v != fa)
28 dfs(G[i].v , p);
29 }
30 int lca(int u , int v)
31 {
32 if(depth[u] < depth[v])
33 swap(u , v);
34 while(depth[u] > depth[v])
35 u = father[u][lg[depth[u] - depth[v]] - 1];
36 if(u == v)
37 return u;
38 for(int i = lg[depth[u]] - 1; i >= 0; i--)
39 if(father[u][i] != father[v][i])
40 u = father[u][i] , v = father[v][i];
41 return father[u][0];
42
43 }
44 int main()
45 {
46 int u , v;
47 scanf("%d%d%d" , &n , &m , &s);
48 for(int i = 1; i < n; i++)
49 {
50 scanf("%d%d" , &u , &v);
51 add(u , v);
52 add(v , u);
53 }
54 dfs(s , 0);
55 for(int i = 1; i <= n; i++)
56 lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
57 for(int i = 1; i <= m; i++)
58 {
59 scanf("%d%d", &u , &v);
60 printf("%d\n" , lca(u , v));
61 }
62 return 0;
63 }
最近公共祖先