代码如下:
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,q,f[N][20],h[N],lg[N];
vector<int> gg[N],g[N];
void dfs(int now,int fa){
h[now]=h[fa]+1;
for(int i=0;i<gg[now].size();i++){
int t=gg[now][i];
if(t!=fa){g[now].push_back(t);f[t][0]=now;dfs(t,now);}
}
}
void init(){
lg[0]=-1;
for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i+(1<<j)-1<=n;i++) f[i][j]=f[f[i][j-1]][j-1];
}
}
int lca(int a,int b){
if(h[a]<h[b]) swap(a,b);
while(h[a]>h[b]) a=f[a][lg[h[a]-h[b]]];
if(a==b) return a;
for(int i=lg[h[a]];i>=0;i--){
if(f[a][i]!=f[b][i]){a=f[a][i];b=f[b][i];}
}
return f[a][0];
}
int dis(int a,int b){
return h[a]+h[b]-2*h[lca(a,b)];
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
gg[x].push_back(y);gg[y].push_back(x);
}
dfs(1,0);
init();
while(q--){
int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);
int x=lca(a,b),y=lca(c,d);
if(dis(a,y)+dis(y,b)==dis(a,b)||dis(c,x)+dis(x,d)==dis(c,d)) printf("Y\n");
else printf("N\n");
}
return 0;
}