1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
   | #include<bits/stdc++.h> using namespace std; int n,m; int d[500001]; int nxt[1000001]; int v[1000001]; int u[1000001];  int pre[500001][30]; int fa[500001]; int tot; int du[500001]; void add(int x,int y) { 	nxt[++tot]=d[x]; 	d[x]=tot; 	v[tot]=y; 	u[tot]=x; 	return ; } void dfs(int now,int last) { 	du[now]=du[last]+1; 	for(int i=d[now];i;i=nxt[i]) 	{    	    if(v[i]!=last) 	    { 	    	fa[v[i]]=now; 			pre[v[i]][0]=now; 			dfs(v[i],now); 		} 	} 	return; } void Init() { 	for(int k=1;k<=29;k++) 	{ 		for(int i=1;i<=n;i++) 		{ 			pre[i][k]=pre[pre[i][k-1]][k-1]; 		} 	} 	return ; } int LCA(int x,int y) { 	if(du[x]<du[y]) 	{ 		swap(x,y); 	} 	for(int i=29;i>=0;i--) 	{ 		if(du[pre[x][i]]>=du[y]) 		{ 			x=pre[x][i]; 		} 	} 	if(x==y) 	{ 		return x; 	} 	for(int i=29;i>=0;i--) 	{ 		if(pre[x][i]!=pre[y][i]) 		{ 			x=pre[x][i]; 			y=pre[y][i]; 		} 	} 	return fa[x]; } inline int read()  { 	char c=getchar(); 	int x=0,bj=1; 	while(c<'0'||c>'9')  	{ 		if(c=='-')  		{ 			bj=-1; 		} 		c=getchar(); 	} 	while(c>='0'&&c<='9')  	{ 		x=(x<<3)+(x<<1)+(c^48); 		c=getchar(); 	} 	return x*bj; } int main() { 	cin>>n>>m; 	for(int i=1;i<n;i++) 	{ 		int x=read(),y=read(); 		add(x,y); 		add(y,x); 	} 	dfs(1,-1); 	Init(); 	for(int i=1;i<=m;i++) 	{ 		int x=read(),y=read(); 		printf("%d\n",LCA(x,y)); 	} 	return 0; }
   |