rt,用的倍增
#include<iostream>
#include<cstring>
#define re register
using namespace std;
const int N = 1e6 + 5;
int p[N][19],d[N],head[N];
int n,q,cnt;
bool vis[N];
struct edge{
int v,next;
}e[N];
inline int jdz(int x){
return (x < 0 ? -x : x);
}
inline void add(int u,int v){
cnt ++;
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
return ;
}
inline void dfs(int u,int fa){
cout<<"RUN\n";
d[u] = d[fa] + 1;
p[u][0] = fa;
for(re int i = head[u];i != -1;i = e[i].next){
int v = e[i].v;
if(v == fa){
continue;
}else{
dfs(v,u);
}
}
return ;
}
inline int LCA(int a,int b){
if(d[a] < d[b]){
swap(a,b);
}
for(re int i = 20;i >= 0;i --){
if(d[p[a][i]] >= d[b]){
a = p[a][i];
}
}
if(a == b){
return a;
}
for(re int i = 20;i >= 0;i --){
if(p[a][i]!=p[b][i]){
a = p[a][i];
b = p[b][i];
}
}
return p[a][0];
}
inline int cal(int x,int y){
int c = LCA(x,y);
return jdz(d[c] - d[x]) + jdz(d[c] - d[y]);
}
inline void init(){
for(re int j = 1;j < 19;j ++){
for(re int i = 1;i <= n;i ++){
p[i][j] = p[p[i][j - 1]][j - 1];
}
}
}
inline void cs(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
memset(head,-1,sizeof(head));
return ;
}
int main(){
cin>>n>>q;
for(re int i = 1;i <= n - 1;i++){
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
init();
for(re int i = 1;i <= q;i ++){
int a,b,c,d;
cin>>a>>b>>c>>d;
int x = LCA(a,b),y = LCA(c,d);
if(cal(x,c) + cal(x,d) == cal(c,d)){
cout<<"Y";
}else if(cal(y,a) + cal(y,b) == cal(a,b)){
cout<<"Y";
}else{
cout<<"N";
}
cout<<"\n";
}
return 0;
}