RT,倍增LCA,样例过了但全WA
// Problem: P3398 仓鼠找sugar
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3398
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)
#include <bits/stdc++.h>
using namespace std;
#define M 100005
int n,m,U,V,d[M],cntt,lf[20][M],a,b,c,e,f,dd,vis[M];
vector<int>road[M];
void dfs(int x)
{
cntt++;
for(int i=0;i<road[x].size();i++)
{
if(d[road[x][i]]) continue;
d[road[x][i]]=d[x]+1;
lf[0][road[x][i]]=x;
dfs(road[x][i]);
}
}
void Re(int x)
{
vis[x]=1;
for(int i=log2(d[x]);i>0;i--)
{
lf[i][x]=lf[i-1][lf[i-1][x]];
}
for(int i=0;i<road[x].size();i++)
{
if(!vis[road[x][i]]) Re(road[x][i]);
}
}
int lowbit(int x)
{
return x & -x;
}
int LCA(int x,int y)
{
int dx=d[x],dy=d[y],fc=dx-dy,k;
if(fc<0)
{
swap(dx,dy);
swap(x,y);
fc=-fc;
}
while(fc)
{
k=lowbit(fc);
fc-=k;
k=log2(k);
x=lf[k][x];
}
if(x==y) return x;
for(int i=log2(dy);i>=0;i--)
{
if(lf[i][x]!=lf[i][y])
{
x=lf[i][x];
y=lf[i][y];
}
}
return lf[0][x];
}
int lth(int x,int y)
{
int L=LCA(x,y),res=0;
res+=d[x]-d[L];
res+=d[y]-d[L];
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<n;i++)
{
cin>>U>>V;
road[U].push_back(V);
road[V].push_back(U);
}
d[1]=1;
dfs(1);
Re(1);
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c>>dd;
if(d[b]>d[a]) swap(a,b);
if(d[dd]>d[c]) swap(c,dd);
e=LCA(a,b);
f=LCA(c,dd);
if((lth(c,e)+lth(dd,e)==lth(c,dd))||(lth(f,a)+lth(f,b)==lth(a,b)))
{
cout<<"Y"<<endl;
}
else
{
cout<<"N"<<endl;
}
}
return 0;
}