第一遍写了倍增但是没加快读,subtask3直接T掉,超了0.01s?!!
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, m, s,dep[N], a, b,anc[N][20];
vector<int> g[N];
inline int read(){
int w = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f *= -1;
ch = getchar();
}
while(isdigit(ch)){
w = (w << 1) + (w << 3) + (ch - 48);
ch = getchar();
}
return w * f;
}
void dfs(int u,int fa)
{
for (auto v : g[u])
{
if (v == fa)
continue;
//fa[v] = u;
dep[v] = dep[u] + 1;
anc[v][0] = u;
dfs(v,u);
}
}
void init(){
for(int j = 1; j <= 18; j ++)
for(int i = 1; i <= n; i ++)
anc[i][j] = anc[anc[i][j-1]][j-1];
}
int LCA(int u, int v)
{
if(dep[u] < dep[v]) swap(u,v);
for(int i = 18; i >= 0; i --){
if(dep[anc[u][i]] >= dep[v]) u = anc[u][i];
}
if(u == v) return u;
for(int i = 18; i >= 0; i --){
while(anc[u][i] != anc[v][i]) u = anc[u][i],v = anc[v][i];
}
return anc[u][0];
}
int main()
{
//ios::sync_with_stdio(0);
n = read(),m = read(), s = read();
for (int i = 1, u, v; i < n; i++)
{
u = read(),v = read();
g[u].push_back(v);
g[v].push_back(u);
}
dep[s] = 1;
dfs(s,0);
init();
while (m--)
{
a = read() , b= read();
if (a == b)
cout << a << endl;
else
cout << LCA(a, b) << endl;
}
return 0;
}