全M+RE,救救我吧
查看原帖
全M+RE,救救我吧
1471193
kkksc24楼主2025/8/3 21:49
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
const int MAXN=5e5+10;
int fa[MAXN][30],d[MAXN],n,m,s,u,v,x,y;
vector<int> g[MAXN]; 
void dfs(int u,int f){
	fa[u][0]=f;
	d[u]=d[f]+1;
	for(auto v:g[u]){
		if(u!=v)dfs(v,u);
	}
}
int lca(int u,int v){
	if(d[u]<d[v])swap(u,v);
	for(int i=22;i>=0;i--){
		if(d[fa[u][i]]>=d[v])u=fa[u][i];
	}
	if(u==v)return u;
	for(int i=22;i>=0;i--){
		if(fa[u][i]!=fa[v][i]){
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}
signed main(){
	n=read(),m=read(),s=read();
	for(int i=1;i<n;i++){
		u=read(),v=read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(s,0);
	for(int j=1;(1<<j)<=n;j++)
		for(int i=1;i<=n;i++)fa[i][j]=fa[fa[i][j-1]][j-1];
	while(m--){
		x=read(),y=read();
		printf("%lld\n",lca(x,y));
	}
	return 0;
}
2025/8/3 21:49
加载中...