func_code_string: #include <bits/stdc++.h>   using namespace std;   struct Edge {     int v;     Edge *link;   } edge[400010 * 2], *adj[200010], *tree[200010 * 2];   int totE, con, root, currT, top, top1;   int totCut, totBi;   int dep[200010], deps[200010], num[200010], dfn[200010], lowlink[200010],       cut[200010], bi[200010], color[200010];   int temp[200010], st1[200010], st2[200010], st3[200010], st4[200010],       f[200010 * 2];   int used[200010 * 2], odd[200010 * 2];   int fa[200010][20];   int LOG[200010];   void addEdge(int u, int v) {     Edge *p = &edge[totE++];     p->v = v;     p->link = adj[u];     adj[u] = p;   }   void addTree(int u, int v) {     Edge *p = &edge[totE++];     p->v = v;     p->link = tree[u];     tree[u] = p;   }   void dfs(int u, int pre) {     dep[u] = dep[pre] + 1;     dfn[u] = lowlink[u] = ++currT;     num[u] = con;     Edge *p = adj[u];     int cnt = 0;     bool flag = false;     while (p) {       if (!dfn[p->v]) {         ++cnt;         dfs(p->v, u);         lowlink[u] = min(lowlink[u], lowlink[p->v]);         if (lowlink[p->v] >= dfn[u]) flag = true;       } else if (p->v != pre)         lowlink[u] = min(lowlink[u], dfn[p->v]);       p = p->link;     }     if (flag && (u != root || cnt > 1)) cut[u] = ++totCut;   }   bool dfs2(int u) {     Edge *p = adj[u];     while (p) {       if (bi[p->v] == totBi) {         if (color[p->v] == -1) {           color[p->v] = !color[u];           if (!dfs2(p->v)) return false;         } else if (color[p->v] == color[u])           return false;       }       p = p->link;     }     return true;   }   void solve() {     ++totBi;     int cnt = 0;     for (int i = 0; i < top1; ++i) {       int u = st3[i], v = st4[i];       bi[u] = totBi;       bi[v] = totBi;       color[u] = color[v] = -1;       if (cut[u]) temp[cnt++] = cut[u];       if (cut[v]) temp[cnt++] = cut[v];     }     sort(temp, temp + cnt);     for (int i = 0; i < cnt; ++i)       if (i == 0 || temp[i] != temp[i - 1]) {         addTree(temp[i], totCut + totBi);         addTree(totCut + totBi, temp[i]);       }     color[st3[0]] = 0;     odd[totBi] = !dfs2(st3[0]);   }   void dfs1(int u, int pre) {     dfn[u] = lowlink[u] = ++currT;     Edge *p = adj[u];     while (p) {       if (!dfn[p->v]) {         st1[top] = u;         st2[top++] = p->v;         dfs1(p->v, u);         lowlink[u] = min(lowlink[u], lowlink[p->v]);         if (lowlink[p->v] >= dfn[u]) {           top1 = 0;           while (true) {             --top;             st3[top1] = st1[top];             st4[top1++] = st2[top];             if (st1[top] == u && st2[top] == p->v) break;           }           solve();         }       } else {         if (dfn[u] > dfn[p->v] && p->v != pre) {           st1[top] = u;           st2[top++] = p->v;         }         if (p->v != pre) lowlink[u] = min(lowlink[u], dfn[p->v]);       }       p = p->link;     }   }   void dfs3(int u, int pre) {     deps[u] = deps[pre] + 1;     used[u] = true;     fa[u][0] = pre;     if (u <= totCut)       f[u] = 0;     else       f[u] = odd[u - totCut];     f[u] += f[pre];     Edge *p = tree[u];     while (p) {       if (!used[p->v]) dfs3(p->v, u);       p = p->link;     }   }   int LCA(int u, int v) {     if (deps[u] < deps[v]) swap(u, v);     int diff = deps[u] - deps[v];     for (int i = 0; diff; ++i, diff >>= 1)       if (diff & 1) u = fa[u][i];     if (u == v) return u;     int t = 19;     for (int i = t; i >= 0; --i) {       if (fa[u][i] != fa[v][i]) {         u = fa[u][i];         v = fa[v][i];       }     }     return fa[u][0];   }   int main() {     LOG[1] = 0;     for (int i = 2; i < 200010; ++i) LOG[i] = (LOG[i] >> 1) + 1;     int n, m;     scanf( %d%d , &n, &m);     for (int i = 0; i < m; ++i) {       int u, v;       scanf( %d%d , &u, &v);       addEdge(u, v);       addEdge(v, u);     }     dep[0] = -1;     for (int i = 1; i <= n; ++i)       if (!dfn[i]) {         root = i;         dfs(i, 0);         ++con;       }     currT = 0;     memset(dfn, 0, sizeof(dfn));     for (int i = 1; i <= n; ++i)       if (!dfn[i]) dfs1(i, 0);     for (int i = 1; i <= totCut + totBi; ++i)       if (!used[i]) dfs3(i, 0);     for (int l = 1; (1 << l) <= totCut + totBi; ++l)       for (int i = 1; i <= totCut + totBi; ++i)         if (fa[i][l - 1] != 0) fa[i][l] = fa[fa[i][l - 1]][l - 1];     int q;     scanf( %d , &q);     for (int i = 0; i < q; ++i) {       int u, v;       scanf( %d%d , &u, &v);       if (u == v || num[u] != num[v])         puts( No );       else {         int x, y;         if (cut[u])           x = cut[u];         else           x = totCut + bi[u];         if (cut[v])           y = cut[v];         else           y = totCut + bi[v];         int lca = LCA(x, y);         int sum = f[x] + f[y] - 2 * f[fa[lca][0]];         if (sum > 0)           puts( Yes );         else if ((dep[u] + dep[v]) % 2 == 0)           puts( No );         else           puts( Yes );       }     }     return 0;   }   