因为受到 P2680 的影响,树链剖分写挂,LCA暴跳得了80分 , 于是来试试 LCA 这个板子题用暴跳多少分,结果直接过了。故请求加强一下数据吧
//
/*
Author : Zmonarch
Knowledge :
*/
#include <bits/stdc++.h>
#define int long long
#define inf 2147483647
using namespace std ;
const int N = 1e6 + 10 ;
int read() {
int x = 0 , f = 1 ; char ch = getchar() ;
while(!isdigit(ch)) {if(ch == '-') f = - 1 ; ch = getchar() ;}
while( isdigit(ch)) {x = x * 10 + ch - '0' ; ch = getchar() ;}
return x * f ;
}
int n , m , rt , cnt ;
int dep[N] , f[N] ;
vector <int> E[N] ;
void add(int u , int v) {
E[u].push_back(v) ;
E[v].push_back(u) ;
}
void dfs(int u , int fa) {
dep[u] = dep[fa] + 1 ; f[u] = fa ;
for(int i = 0 ; i < E[u].size() ; i++)
{
int v = E[u][i] ;
if(v == fa) continue ;
dfs(v , u) ;
}
}
int Query(int u , int v) {
while(u ^ v)
{
if(dep[u] < dep[v]) swap(u , v) ;
u = f[u] ;
}
return dep[u] > dep[v] ? u : v ;
}
signed main() {
n = read() , m = read() , rt = read() ;
for(int u , v , i = 1 ; i <= n - 1 ; i++)
u = read() , v = read() , add(u , v) ;
dfs(rt , 0) ;
for(int u , v , i = 1 ; i <= m ; i++)
u = read() , v = read() , printf("%lld\n" , Query(u , v)) ;
return 0 ;
}