func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100010;   int n, m;   int head[N], nxt[N * 2], to[N * 2], tot;   int vis[N], stp[N];   int dp[N][20];   int dfn[N], low[N], dep = 0;   int stk[N * 5], top = 0;   int belong[N], block = 0;   int odd[N], col[N];   void init() {     memset(head, -1, sizeof(head));     tot = 0;   }   void add(int x, int y) {     to[tot] = y;     nxt[tot] = head[x];     head[x] = tot++;   }   void DFS_st(int u, int fa) {     vis[u] = 1;     stp[u] = stp[fa] + 1;     dp[u][0] = fa;     for (int i = 1; i < 20; i++) dp[u][i] = dp[dp[u][i - 1]][i - 1];     for (int i = head[u]; ~i; i = nxt[i]) {       int v = to[i];       if (!vis[v]) DFS_st(v, u);     }   }   void tarjan(int u, int fa) {     dfn[u] = low[u] = ++dep;     stk[top++] = u;     vis[u] = 1;     for (int i = head[u]; ~i; i = nxt[i]) {       int v = to[i];       if (v == fa) continue;       if (!dfn[v]) {         tarjan(v, u);         low[u] = min(low[u], low[v]);       } else if (vis[v])         low[u] = min(low[u], dfn[v]);     }     if (low[u] == dfn[u]) {       block++;       do {         top--;         belong[stk[top]] = block;         vis[stk[top]] = 0;       } while (stk[top] != u);     }   }   void DFS(int u, int fa) {     vis[u] = 1;     for (int i = head[u]; ~i; i = nxt[i]) {       int v = to[i];       if (!vis[v]) {         col[v] += col[u];         DFS(v, u);       }     }   }   int LCA(int x, int y) {     if (stp[x] < stp[y]) swap(x, y);     int delta = stp[x] - stp[y];     for (int i = 0; i < 20; i++)       if (delta & (1 << i)) x = dp[x][i];     if (x == y) return x;     for (int i = 19; i >= 0; i--)       if (dp[x][i] != dp[y][i]) x = dp[x][i], y = dp[y][i];     return dp[x][0];   }   int main() {     init();     scanf( %d%d , &n, &m);     for (int i = 1; i <= m; i++) {       int x, y;       scanf( %d%d , &x, &y);       add(x, y);       add(y, x);     }     for (int u = 1; u <= n; u++)       if (!vis[u]) DFS_st(u, 0);     memset(vis, 0, sizeof(vis));     for (int u = 1; u <= n; u++)       if (!dfn[u]) tarjan(u, 0);     for (int u = 1; u <= n; u++) {       if (!odd[belong[u]]) {         for (int i = head[u]; ~i; i = nxt[i]) {           int v = to[i];           if ((stp[u] + stp[v]) % 2 == 0 && belong[v] == belong[u]) {             odd[belong[u]] = 1;             break;           }         }       }     }     for (int u = 1; u <= n; u++)       if (belong[u] == belong[dp[u][0]] && dp[u][0] != 0 && odd[belong[u]])         col[u]++;     memset(vis, 0, sizeof(vis));     for (int u = 1; u <= n; u++)       if (!vis[u]) DFS(u, 0);     int q;     scanf( %d , &q);     while (q--) {       int u, v;       scanf( %d%d , &u, &v);       int lca = LCA(u, v);       if (lca == 0) {         printf( No n );       } else if ((stp[u] + stp[v] - stp[lca] * 2) % 2 == 1)         printf( Yes n );       else {         if (col[u] + col[v] != col[lca] * 2)           printf( Yes n );         else           printf( No n );       }     }     return 0;   }   