WA on #2 #7 #8
#include <bits/stdc++.h>
using namespace std;
namespace Prulystic { void Main(); }
int main(){
Prulystic::Main();
return 0;
}
namespace Prulystic{
const int N = 2e4 + 5;
using graph = vector<int>;
int n, m, q, dfc, vdcc_idx, top;
int dfn[N], low[N], stk[N], dpt[N], fa[N][16];
graph g[N], t[N << 1];
inline void add(graph grp[], int u, int v){
grp[u].push_back(v),
grp[v].push_back(u);
}
inline void vdcc(int u){
dfn[u] = low[u] = ++dfc;
stk[++top] = u;
for(int v : g[u]){
if(!dfn[v]){
vdcc(v);
low[u] = min(low[u], low[v]);
if(low[v] >= dfn[u]){
vdcc_idx++;
int tmp;
do{
tmp = stk[top--];
add(t, vdcc_idx, tmp);
}while(tmp != v);
add(t, vdcc_idx, u);
}
}else
low[u] = min(low[u], dfn[v]);
}
}
inline void init(int u, int f){
fa[u][0] = f, dpt[u] = dpt[f] + 1;
for(int i = 0; i < 15; i++)
fa[u][i + 1] = fa[fa[u][i]][i];
for(int v : t[u])
if(v != f)
init(v, u);
}
inline int getLca(int u, int v){
if(dpt[u] > dpt[v])
swap(u, v);
for(int i = 15; i >= 0; i--)
if(dpt[fa[v][i]] >= dpt[u])
v = fa[v][i];
if(u == v)
return u;
for(int i = 15; i >= 0; i--)
if(fa[u][i] != fa[v][i])
u = fa[u][i], v = fa[v][i];
return fa[u][0];
}
inline bool judge(int u, int v, int w){
if(getLca(u, w) == w || getLca(v, w) == w)
return true;
return false;
}
inline void read(int& x){
int s = 0, w = 1;
char ch = getchar();
while(!isdigit(ch)) { w = (ch == '-' ? -1 : 1); ch = getchar(); }
while(isdigit(ch)) { s = s * 10 + ch - '0'; ch = getchar(); }
x = s * w;
}
void Main(){
read(n), read(m);
vdcc_idx = n;
for(int i = 1; i <= m; i++){
int u, v; read(u), read(v);
add(g, u, v);
}
for(int u = 1; u <= n; u++)
if(!dfn[u])
vdcc(u);
init(1, 0);
read(q);
while(q--){
int u, v, w; read(u), read(v), read(w);
int lca = getLca(u, v);
if(dpt[w] < dpt[lca])
printf("no\n");
else{
if(judge(u, v, w))
printf("yes\n");
else
printf("no\n");
}
}
}
}