https://www.luogu.com.cn/problem/P2590


#include<bits/stdc++.h>
#define int long long

using namespace std;

// const int Size=(1<<20)+1;
// char buf[Size],*p1=buf,*p2=buf;
// char buffer[Size];
// int op1=-1;
// const int op2=Size-1;
// #define getchar()                                                              \
// (tt == ss && (tt=(ss=In)+fread(In, 1, 1 << 20, stdin), ss == tt)     \
// 	? EOF                                                                 \
// 	: *ss++)
// char In[1<<20],*ss=In,*tt=In;
inline int read()
{
	int x=0,c=getchar(),f=0;
	for(;c>'9'||c<'0';f=c=='-',c=getchar());
	for(;c>='0'&&c<='9';c=getchar())
		x=(x<<1)+(x<<3)+(c^48);
	return f?-x:x;
}
inline void write(int x)
{
	if(x<0) x=-x,putchar('-');
	if(x>9)  write(x/10);
	putchar(x%10+'0');
}

vector<int> E[1<<20];
void add(int u,int v) { E[u].push_back(v); }
int deep[1<<20],f[1<<20],siz[1<<20];
int son[1<<20],id[1<<20],rk[1<<20];
int root,op,cnt,top[1<<20];
int n,m;

void dfs1(int p,int fa)
{
	siz[p]=1;
	f[p]=fa;
	deep[p]=deep[fa]+1;

	int maxv=-1;
	for(int i=0;i<E[p].size();i++)
	{
		int to=E[p][i];
		if(to==fa) continue;

		dfs1(to,p);
		siz[p]+=siz[to];
		if(siz[to]>maxv)
		{
			maxv=siz[to];
			son[p]=to;
		}
	}
}

void dfs2(int p,int tp)
{
	top[p]=tp;
    
	if(!son[p]) return;
	dfs2(son[p],tp);

	for(int i=0;i<E[p].size();i++)
	{
		int to=E[p][i];
		if(to==f[p]||to==son[p]) continue;
		dfs2(to,to);
	}
}

int lca(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(deep[top[x]]>=deep[top[y]]) x=f[top[x]];
		else y=f[top[y]];
	}
	return deep[x]<deep[y]?x:y;
}

// void add(int u,int v) { E[u].push_back(v); }

signed main()
{
	n=read();
	m=read();
	root=read();

	for(int i=1;i<n;i++)
	{
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}

	dfs1(root,0);
	dfs2(root,root);
	while(m--)
	{
		write(lca(read(),read()));
		putchar('\n');
	}
	return 0;
}



posted @ 2025-02-27 18:18  Wy_x  阅读(3)  评论(0)    收藏  举报