voiddfs(int u, int father){ dep[u] = dep[father] + 1; for (int i = 0; i <= 18; i++) { f[u][i + 1] = f[f[u][i]][i]; } for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (v == father) { continue; } f[v][0] = u; dfs(v, u); } }
intlca(int x, int y){ if (dep[x] < dep[y])swap(x, y); for (int i = 19; i >= 0; i--) { if (dep[f[x][i]] >= dep[y])x = f[x][i]; if (x == y) return x; } for (int i = 19; i >= 0; i--) { if (f[x][i] != f[y][i]) { x = f[x][i]; y = f[y][i]; } } return f[x][0]; }
intmain(){ scanf("%d %d %d",&n,&m,&s); for (int i = 1; i <= n-1; i++) { x=read();y=read(); g[x].push_back(y); g[y].push_back(x); } dfs(s,0); for (int i = 1; i <= m; i++) { a=read();b=read(); ans = lca(a, b); printf("%d\n",ans); } return0; }