#include<bits/stdc++.h>
using namespace std;
.
namespace acac
{
struct edge
{
int to,ne;
}e[1000010];
int H[500010];
int cnt;
void add(int a,int b)
{
e[++cnt].to=b;
e[cnt].ne=H[a];
H[a]=cnt;
}
int st[500010][30],dfn[500010];
int tot;
void dfs(int u,int fa)
{
// cout<<fa<<endl;
// if(u==99384)cout<<"NO";
dfn[u]=++tot;
st[dfn[u]][0]=fa;
// cout<<dfn[u]<<endl;
// cout<<u<<endl;
for(int i=H[u];i;i=e[i].ne)
{
int v=e[i].to;
if(v==fa)continue;
//cout<<v;
dfs(v,u);
}
}
int read()
{
int ans=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
ans=ans*10+ch-'0';
ch=getchar();
}
return ans;
}
int main()
{
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=2;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(s,0);
for(int i=1;i<=20;i++)
{
for(int j=1;j<=n;j++)
{
if(j+(1<<i)-1>n)break;
if(dfn[st[j][i-1]]<dfn[st[j+(1<<i-1)][i-1]])st[j][i]=st[j][i-1];
else st[j][i]=st[j+(1<<i-1)][i-1];
// if(j==3&&i==1)cout<<st[j][i];
}
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
// cout<<dfn[x]<<' '<<dfn[y]<<endl;
if(x==y)cout<<x<<'\n';
else
{
if(dfn[x]>dfn[y])swap(x,y);
int lca,k=__lg(dfn[y]-dfn[x]-1);
if(dfn[st[dfn[x]+1][k]]<dfn[st[dfn[y]-(1<<k)+1][k]])lca=st[dfn[x]+1][k];
else lca=st[dfn[y]-(1<<k)+1][k];
cout<<lca<<'\n';
// cout<<dfn[x]<<' '<<dfn[y]<<endl;
}
}
// cout<<ans;
return 0;
}
}
int main()
{
// freopen("P3379_1.in","r",stdin);
acac::main();
return 0;
}
内存溢出,但不知是哪。
在if(u==99394)cout<<v;可以输出,但if(u==99394)cout<<v<<endl;不行。