代码如下啊啊啊
#include <bits/stdc++.h>
#define f(i,a,b) for(register int i=a;i<=b;i++)
#define f2(i,a,b) for(register int i=a;i>=b;i--)
#define RD read()
#define RE register
#define IL inline
using namespace std;
typedef long long ll;
inline 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<<1)+(x<<3)+(ch^48); ch=getchar();}
return x*f;
}
int const N=1e5+5;
int n,q;
int h[N],to[2*N],nxt[2*N],cnt;
IL int add_edge(int u,int v){
to[++cnt]=v;
nxt[cnt]=h[u];
h[u]=cnt;
}
int dep[N],f[N][20];
IL void dfs(int u,int pre){
dep[u]=dep[pre]+1;
f[u][0]=pre;
f(i,2,20) f[u][i]=f[f[u][i-1]][i-1];
for(RE int e=h[u];e;e=nxt[e]){
int v=to[e];
if(v==pre) continue;
dfs(v,u);
}
}
IL int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
f2(i,20,0){
if(x==y) return x;
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
if(dep[x]==dep[y]) break;
}
f2(i,20,0) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
IL int dis(int x,int y){
int k=LCA(x,y);
return abs(dep[x]-dep[k])+abs(dep[y]-dep[k]);
}
int main() {
ios::sync_with_stdio(false);
n=RD,q=RD;
f(i,1,n-1){
int u=RD,v=RD;
add_edge(u,v);
add_edge(v,u);
}
dfs(1,1);
// printf("LCA 1,1=%d\n",LCA(1,1));
while(q--){
int u1=RD,v1=RD,u2=RD,v2=RD;
int k1=LCA(u1,v1),k2=LCA(u2,v2);
// printf("*************************\n1. LCA of %d and %d is %d.\n2. LCA of %d and %d is %d.\n",u1,v1,k1,u2,v2,k2);
if(dis(u1,k2)+dis(k2,v1)==dis(u1,v1) || dis(u2,k1)+dis(k1,v2)==dis(u2,v2))
printf("Y\n");
else printf("N\n");
// printf("[%d,%d]=%d [%d,%d]=%d [%d,%d]=%d\n[%d,%d]=%d [%d,%d]=%d [%d,%d]=%d\n",u1,k2,dis(u1,k2),k2,v1,dis(k2,v1),u1,v1,dis(u1,v1),u2,k1,dis(u2,k1),k1,v2,dis(k1,v2),u2,v2,dis(u2,v2));
}
return 0;
}