#include <bits/stdc++.h>
int read() {
  char k = getchar();
  int x = 0;
  while (k < '0' || k > '9') k = getchar();
  while (k >= '0' && k <= '9') x = x * 10 + k - '0', k = getchar();
  return x;
}
const int MX = 2e5 + 23;
int n, m;
int ORG[MX], CAC[MX], tot = 1;
struct edge {
  int node, next, w;
} h[MX * 6];
void addedge(int u, int v, int *head, int flg = 1) {
  h[++tot] = (edge){v, head[u], 1}, head[u] = tot;
  if (flg) addedge(v, u, head, 0);
}
int __[MX];
void init() {
  for (int i = 1; i < MX; ++i) __[i] = i;
}
int find(int x) { return __[x] == x ? x : __[x] = find(__[x]); }
void link(int u, int v) { __[find(u)] = find(v); }
int DFN[MX], low[MX], stk[MX], stktop, cnt, jishu[MX];
int pcnt, oddcyc, color[MX];
void tarjan(int x, int c = 0, int *head = ORG) {
  DFN[x] = low[x] = ++cnt, stk[++stktop] = x;
  color[x] = c;
  for (int i = head[x], d; i; i = h[i].next) {
    int odd = oddcyc;
    if (h[i].w) {
      if (color[d = h[i].node] == c) ++oddcyc;
      h[i].w = h[i ^ 1].w = 0;
    }
    if (!DFN[d = h[i].node]) {
      int QWQ = odd;
      tarjan(d, c ^ 1);
      odd = (oddcyc - odd) > 0;
      low[x] = std::min(low[x], low[d]);
      if (low[d] == DFN[x]) {
        jishu[++pcnt] = odd;
        color[pcnt] = 0;
        for (int tmp = 0; tmp != d; --stktop) {
          tmp = stk[stktop];
          addedge(pcnt, tmp, CAC);
          fprintf(stderr, "LINK %d %d\n", pcnt, tmp);
        }
        addedge(x, pcnt, CAC);
        fprintf(stderr, "lINK %d %d\n", x, pcnt);
        oddcyc = QWQ;
      }
    } else if (DFN[d] < low[x])
      low[x] = DFN[d];
  }
}
int hson[MX], size[MX], dep[MX], fa[MX];
int Sji[MX];
void dfs(int x, int *head = CAC) {
  Sji[x] += jishu[x];
  fprintf(stderr, "Sji[%d] = %d col = %d ,ji = %d\n", x, Sji[x], color[x],
          jishu[x]);
  size[x] = 1;
  for (int i = head[x], d; i; i = h[i].next) {
    if ((d = h[i].node) == fa[x]) continue;
    fa[d] = x, dep[d] = dep[x] + 1;
    Sji[d] += Sji[x];
    dfs(d);
    size[x] += size[d];
    if (size[d] > size[hson[x]]) hson[x] = d;
  }
}
int top[MX];
void dfs2(int x, int topf, int *head = CAC) {
  top[x] = topf;
  for (int i = head[x], d; i; i = h[i].next) {
    if ((d = h[i].node) == fa[x]) continue;
    dfs2(d, d == hson[x] ? topf : d);
  }
}
int LCA(int x, int y) {
  while (top[x] != top[y]) {
    if (dep[top[x]] < dep[top[y]]) std::swap(x, y);
    x = fa[top[x]];
  }
  return dep[x] < dep[y] ? x : y;
}
int query(int x, int y) {
  if (x == y) return 0;
  if (find(x) != find(y)) return 0;
  int lca = LCA(x, y);
  if (Sji[x] + Sji[y] - 2 * Sji[lca] + jishu[lca]) return 1;
  if (color[x] ^ color[y]) return 1;
  return 0;
}
int main() {
  memset(color, -1, sizeof color);
  init();
  pcnt = n = read(), m = read();
  for (int i = 1, u, v; i <= m; ++i) {
    u = read(), v = read();
    addedge(u, v, ORG);
    link(u, v);
  }
  for (int i = 1; i <= n; ++i)
    if (!DFN[i]) tarjan(i);
  for (int i = 1; i <= pcnt; ++i)
    fprintf(stderr, "color[%d] = %d\n", i, color[i]);
  memset(DFN, 0, sizeof DFN);
  for (int i = 1; i <= n; ++i) {
    if (!DFN[find(i)]) {
      DFN[find(i)] = 1;
      dfs(find(i));
      dfs2(find(i), find(i));
    }
  }
  int q = read();
  while (q--) {
    int u = read(), v = read();
    printf("%s\n", query(u, v) ? "Yes" : "No");
  }
  return 0;
}
