mirror of
https://git.sb/baoshuo/OI-codes.git
synced 2024-11-30 21:16:27 +00:00
70 lines
1.4 KiB
C++
70 lines
1.4 KiB
C++
|
#include <bits/stdc++.h>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
int head[100005], ver[200005], nex[200005], tot;
|
||
|
int fa[100005][30], dep[100005];
|
||
|
|
||
|
inline void addedge(int u, int v) {
|
||
|
ver[tot] = v;
|
||
|
nex[tot] = head[u];
|
||
|
head[u] = tot++;
|
||
|
}
|
||
|
|
||
|
void dfs(int pre, int cur) {
|
||
|
fa[cur][0] = pre;
|
||
|
dep[cur] = dep[pre] + 1;
|
||
|
for (int i = 1; i <= 25; i++) {
|
||
|
fa[cur][i] = fa[fa[cur][i - 1]][i - 1];
|
||
|
}
|
||
|
for (int i = head[cur]; i != -1; i = nex[i]) {
|
||
|
if (!dep[ver[i]]) {
|
||
|
dfs(cur, ver[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int lca(int u, int v) {
|
||
|
if (dep[u] > dep[v]) {
|
||
|
swap(u, v);
|
||
|
}
|
||
|
for (int i = 25; i > -1; i--) {
|
||
|
if (dep[fa[v][i]] >= dep[u]) {
|
||
|
v = fa[v][i];
|
||
|
}
|
||
|
}
|
||
|
if (u == v) {
|
||
|
return v;
|
||
|
}
|
||
|
for (int i = 25; i > -1; i--) {
|
||
|
if (fa[u][i] != fa[v][i]) {
|
||
|
u = fa[u][i];
|
||
|
v = fa[v][i];
|
||
|
}
|
||
|
}
|
||
|
return fa[u][0];
|
||
|
}
|
||
|
|
||
|
int main() {
|
||
|
int n, t, x, y, a, b, c, d;
|
||
|
cin >> n >> t;
|
||
|
memset(head, -1, sizeof(head));
|
||
|
for (int i = 1; i < n; i++) {
|
||
|
cin >> x >> y;
|
||
|
addedge(x, y);
|
||
|
addedge(y, x);
|
||
|
}
|
||
|
dfs(0, 1);
|
||
|
while (t--) {
|
||
|
cin >> a >> b >> c >> d;
|
||
|
int x = lca(a, b), y = lca(c, d);
|
||
|
if (dep[x] > dep[y]) {
|
||
|
swap(x, y);
|
||
|
swap(a, c);
|
||
|
swap(b, d);
|
||
|
}
|
||
|
cout << (lca(x, y) == x && (lca(a, y) == y || lca(b, y) == y) ? "Y" : "N") << endl;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|