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
|
#include<bits/stdc++.h> using namespace std; #define INIT(a,b) memset(a,b,sizeof(a)) const int maxn=1e5+7; int Begin[maxn],fa[maxn][30],lg[maxn],depth[maxn]; struct Edge{ int to,next; }ae[maxn<<1]; int tot=0,n,q; int a,b,c,d; void Add(int x,int y){ ae[tot]=(Edge){y,Begin[x]}; Begin[x]=tot++; } void Dfs(int now,int f){ fa[now][0]=f; depth[now]=depth[f]+1; for(int i=1;(1<<i)<=depth[now];i++) fa[now][i]=fa[fa[now][i-1]][i-1]; for(int i=Begin[now];~i;i=ae[i].next) if(ae[i].to!=f)Dfs(ae[i].to,now); } int Lca(int x,int y){ if(depth[x]<depth[y]) swap(x,y); while(depth[x]>depth[y]) x=fa[x][lg[depth[x]-depth[y]]-1]; if(x==y) return x; for(int i=lg[depth[x]];i>=0;i--){ if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; } return fa[x][0]; } bool Judge(int x,int y){ if(depth[x]<depth[y]) return false; while(depth[x]>depth[y]) x=fa[x][lg[depth[x]-depth[y]]-1]; if(x==y) return true; return false; } int main(){ INIT(Begin,-1); scanf("%d %d",&n,&q); for(int i=0;i<n-1;i++){ scanf("%d%d",&a,&b); Add(a,b);Add(b,a); } for(int i=1;i<=n;i++) lg[i]=lg[i-1]+(1<<lg[i-1]==i); Dfs(1,0); while(q--){ scanf("%d%d%d%d",&a,&b,&c,&d); int x=Lca(a,b),y=Lca(c,d); if(depth[x]<depth[y]){ if(Judge(a,y)||Judge(b,y))printf("Y\n"); else printf("N\n"); } else{ if(Judge(c,x)||Judge(d,x))printf("Y\n"); else printf("N\n"); } } return 0; }
|