#include #include #include using namespace std;inline void swap(int &a,int &b){a=a^b;b=a^b;a=a^b;}inline int abs(int x){return x>0?x:-x;}int n,q,a,b,c,d,head[100005],dep[100005],fa[100005][25],cnt;//fa开小了QwQ调了一个小时(YP:把我命调没了) struct edge{ int v,next;}e[500005];inline void add(int u,int v){ e[++cnt].v=v; e[cnt].next=head[u]; head[u]=cnt;}inline void dfs(int u,int fau){ dep[u]=dep[fau]+1; fa[u][0]=fau; for(int i=1;(1< <=dep[u];i++)fa[u][i]=fa[fa[u][i-1]][i-1]; for(int i=head[u];i!=-1;i=e[i].next){ if(e[i].v!=fau)dfs(e[i].v,u); }}inline int lca(int x,int y){ if(dep[x] =0;i--) if(dep[x]-dep[y]>=(1< =0;i--){ if(fa[x][i]!=fa[y][i]){ x=fa[x][i];y=fa[y][i]; } } return fa[y][0];}inline int dis(int x,int y){//这个思路很重要 int u=lca(x,y); return abs(dep[x]-dep[u])+abs(dep[y]-dep[u]);}inline bool on(int a,int x,int y){//这个思路很重要 if(dis(x,a)+dis(a,y)==dis(x,y))return 1; return 0;}int main(){ memset(head,-1,sizeof(head)); scanf("%d%d",&n,&q); for(int i=1;i<=n-1;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(1,0);//这一行没写调了半小时 while(q--){ scanf("%d%d%d%d",&a,&b,&c,&d); int u1=lca(a,b),u2=lca(c,d); if(on(u1,c,d)||on(u2,a,b))printf("Y\n"); else printf("N\n"); }}