没错我是来求条的(
RE0指代码因RE导致爆零(
蒟蒻无聊水了个倍增求LCA模板,但是它怎么RE了(哭
哇我快读都善掉了,,,
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
const int M = log2 (N) + 1;
int f[N][M], a[N], depth[N];
vector<int> e[N];
int n, m, rt;
int create_ST (int u, int fa) {
depth[u] = depth[fa] + 1;
int k = log2 (n);
for (int i = 0; i <= k; i ++) {
f[u][i + 1] = f[f[u][i]][i];
}
for (int i = 0 ; i < e[u].size(); i ++) {
int j = e[u][i];
if (j == fa) continue;
f[j][0] = u;
create_ST(j, u);
}
}
inline int LCA (int x, int y) {
if (depth[x] < depth[y]) swap(x, y);
int k = log2 (n);
for (int i = k; i >= 0; i --) {
if (depth[f[x][i]] >= depth[y]) x = f[x][i];
if (x == y) return x;
}
for (int i = k ; i >= 0; i --) {
if (f[x][i] != f[y][i]) {
x = f[x][i];
y = f[y][i];
}
}
return f[x][0];
}
int main() {
int x, y;
scanf ("%d%d%d", &n, &m, &rt);
for (int i = 1; i < n; i ++) {
scanf ("%d%d", &x, &y);
e[x].push_back(y);
e[y].push_back(x);
}
create_ST (rt, 0);
for (int i = 1; i <= m; i ++) {
scanf ("%d%d", &x, &y);
printf ("%d\n", LCA (x, y));
}
return 0;
}