抱歉我之前一直删帖,但现在我实在找不出什么方法了qwq
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000005;
int nn,heads[maxn],parent[maxn][20],depth[maxn];
struct node
{
int to,next;
}pool[maxn];
void dfs(int r,int father)
{
depth[r]=depth[father]+1;
parent[r][0]=father;
for(int i=1;i<20;i++)
{
parent[r][i]=parent[parent[r][i-1]][i-1];
}
for(int i=heads[r];i!=0;i=pool[i].next)
{
if(pool[i].to!=father)
{
dfs(pool[i].to,r);
}
}
}
int lca(int x,int y)
{
if(depth[x]<depth[y])
{
swap(x,y);
}
for(int i=19;i>=0;i--)
{
if(depth[parent[x][i]]>=depth[y])
{
x=parent[x][i];
}
}
if(x==y)
{
return x;
}
for(int i=19;i>=0;i--)
{
if(parent[x][i]!=parent[y][i])
{
x=parent[x][i];
y=parent[y][i];
}
}
return parent[x][0];
}
void addedge(int u,int v)
{
pool[++nn].to=v;
pool[nn].next=heads[u];
heads[u]=nn;
}
inline int qr()
{
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<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*f;
}
bool inpath(int x,int a,int b)
{
int lca1=lca(a,b);
if(depth[x]<depth[lca1])
{
return false;
}
return x==lca(x,a)||x==lca(a,b);
}
int main()
{
int n=qr(),m=qr();
for(int i=1;i<=n-1;i++)
{
int a=qr(),b=qr();
addedge(a,b);
addedge(b,a);
}
dfs(1,1);
for(int i=0;i<m;i++)
{
int a=qr(),b=qr(),c=qr(),d=qr();
int aa=lca(a,b);
int cc=lca(c,d);
if(depth[aa]>depth[cc])
{
if(inpath(aa,c,d))
{
cout<<"Y"<<endl;
}
else
{
cout<<"N"<<endl;
}
}
else
{
if(inpath(cc,a,b))
{
cout<<"Y"<<endl;
}
else
{
cout<<"N"<<endl;
}
}
}
}