LCA写挂了,求助。
#include <bits/stdc++.h>
#define N 500000 + 10
using namespace std;
inline int read() {
int f = 1 , x = 0;
char ch = getchar();
for(;!isdigit(ch);ch=getchar()) if(ch == '-') f = -1;
for(;isdigit(ch);ch=getchar()) x = x * 10 + (ch - '0');
return f * x;
}
int n , m , s;
int x , y;
vector <int> G[N];
int dep[N];
int fa[N][23];
int Log[N];
void Loginit(){
Log[1] = 0;
for(int i=2;i<=n;i++) {
Log[i] = Log[i/2] + 1;
}
return ;
}
void dfs(int u , int father) {
fa[u][0] = father, dep[u] = dep[father] + 1;
for(int j=1;j<=Log[dep[u]];j++) {
fa[u][j] = fa[fa[u][j-1]][j-1];
}
for(int i=0;i<G[i].size();i++) {
int v = G[u][i];
if(v != father) dfs(v,u);
}
return ;
}
void pre() {
Loginit();
dfs(s,0);
}
int LCA(int x , int y) {
if(dep[x] < dep[y]) swap(x,y);
while(dep[x] > dep[y]) {
x = fa[x][Log[dep[x]-dep[y]]];
}
if(x == y) return x;
for(int k = Log[dep[x]];k;k--) {
if(fa[x][k] != fa[y][k]) {
x = fa[x][k] , y = fa[y][k];
}
}
return fa[x][0];
}
int main(){
n = read() , m = read() , s = read();
for(int i=1;i<n;i++) {
x = read() , y = read();
G[x].push_back(y);
G[y].push_back(x);
}
pre();
while(m--) {
x = read() , y = read();
printf("%d\n",LCA(x,y));
}
return 0;
}