如题
#include <cstdio>
#include <cmath>
#include <iostream>
#define MAXN 500010
using namespace std;
int n, m, cnt, s, ts;
int x, y;
int f[MAXN][22];
int deep[MAXN];
int now[MAXN];
bool vis[MAXN];
struct E{
int from, to, nxt;
} es[MAXN * 2];
int read() {
int f = 1, k = 0;
char c = getchar();
while (c < '0' || c > '9') {
if(c == '-') {
f = -1;
}
c = getchar();
}
while(c >= '0' && c <= '9') {
k = k * 10 + c - '0';
c = getchar();
}
return f * k;
}
void addedge(int a, int b) {
es[++ cnt].from = a;
es[cnt].to = b;
es[cnt].nxt = now[a];
now[a] = cnt;
}
void dfs(int x) {
vis[x] = true;
for(int i = now[x]; i != 0; i = es[i].nxt) {
if(!vis[es[i].to]) {
deep[es[i].to] = deep[x] + 1;
f[es[i].to][0] = x;
dfs(es[i].to);
}
}
}
void lca_init(int a) {
for(int i = 1; i <= ts; i ++) {
for(int j = 1; j <= n; j ++) {
f[j][i] = f[f[j][i - 1]][i - 1];
}
}
}
int lca(int a, int b) {
if(deep[a] < deep[b]) swap(a, b); // a > b;
for(int i = ts; i >= 0; i --) {
if(deep[f[a][i]] >= deep[b]) a = f[a][i];
}
if(a == b) return a;
for(int i = ts; i >= 0; i --) {
if(f[a][i] != f[b][i]) a = f[a][i], b = f[b][i];
}
return f[a][0];
}
int main() {
n = read(), m = read(), s = read();
for(int i = 1; i < n; i ++) {
x = read(), y = read();
addedge(x, y);
addedge(y, x);
}
ts = log(n) / log(2) + 1;
deep[s] = 1;
dfs(s);
lca_init(s);
for(int i = 1; i <= m; i ++) {
x = read(), y = read();
printf("%d\n", lca(x, y));
}
return 0;
}