只通过了 SubTask 0,SubTask 1 一个点都没过,敬请各位大佬鼎力相助!(我是蒟蒻)
#include<bits/stdc++.h>
#define ll long long
#define left(x,y) ((x)<<(y))
#define right(x,y) ((x)>>(y))
#define p1 ((p)<<1)
#define p2 ((p)<<1|1)
using namespace std;
const int MAXN=5e5+10;
struct node
{
int next,to;
};
node a[left(MAXN,1)];
int head[MAXN],father[MAXN],deep[MAXN],dis[MAXN],f[MAXN][30];
int cnt=0;
inline int read()
{
int res=0,flag=1;
char c=getchar();
while (c<'0'||c>'9')
{
if (c=='-')
{
flag=-1;
}
c=getchar();
}
while (c>='0'&&c<='9')
{
res=left(res,3)+left(res,1)+(c^48);
c=getchar();
}
return res*flag;
}
inline void write(ll x)
{
if (x<0)
{
putchar('-');
x=-x;
}
if (x>9)
{
write(x/10);
}
putchar(x%10+'0');
}
void add(int from_,int to_)
{
cnt++;
a[cnt]=(node){head[from_],to_};
head[from_]=cnt;
}
void dfs(int x,int y)
{
int id=head[x];
father[x]=y;
while (id!=-1)
{
if (a[id].to==y)
{
id=a[id].next;
continue;
}
deep[a[id].to]=deep[x]+1;
dis[a[id].to]=dis[x];
dfs(a[id].to,x);
id=a[id].next;
}
}
int LCA(int x,int y)
{
if (deep[x]<deep[y])
{
swap(x,y);
}
for (int i=20;i>=0;i--)
{
if (deep[f[x][i]]>=deep[y])
{
x=f[x][i];
}
}
if (x==y)
{
return x;
}
for (int i=20;i>=0;i--)
{
if (f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return father[x];
}
void DP(int n)
{
for (int i=1;i<=n;i++)
{
f[i][0]=father[i];
}
for (int j=1;j<16;j++)
{
for (int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
}
}
}
int main()
{
int n,m,s,x,y;
n=read();
m=read();
s=read();
memset(head,-1,sizeof(head));
for (int i=1;i<n;i++)
{
x=read();
y=read();
add(x,y);
add(y,x);
}
deep[s]=1;
dfs(s,0);
DP(n);
while (m--)
{
x=read();
y=read();
if (x==y)
{
write(x);
putchar('\n');
continue;
}
write(LCA(x,y));
putchar('\n');
}
return 0;
}