#include <bits/stdc++.h>
using namespace std;
template <class T>
void rd(T &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
  x *= f;
}
const int maxn = 2e5 + 5;
int n, m, top, idx, bcc, q;
int _u[maxn], _v[maxn];
int dfn[maxn], low[maxn], sta[maxn];
int dep[maxn], pre[maxn][21], mrk[maxn][21];
struct edge {
  int v, nxt;
};
vector<edge> e;
struct round_square_tree {
  int head[maxn];
  round_square_tree() { memset(head, -1, sizeof(head)); }
  void adde(int u, int v) {
    e.push_back((edge){v, head[u]});
    head[u] = e.size() - 1;
    e.push_back((edge){u, head[v]});
    head[v] = e.size() - 1;
  }
  void dfs(int u, int f) {
    dep[u] = dep[f] + 1;
    pre[u][0] = f;
    for (int i = (1); i <= (20); ++i) pre[u][i] = pre[pre[u][i - 1]][i - 1];
    for (int i = head[u]; ~i; i = e[i].nxt) {
      int v = e[i].v;
      if (v == f) continue;
      dfs(v, u);
    }
  }
  void dfs2(int u, int f) {
    for (int i = (1); i <= (20); ++i)
      mrk[u][i] = mrk[u][i - 1] | mrk[pre[u][i - 1]][i - 1];
    for (int i = head[u]; ~i; i = e[i].nxt)
      if (e[i].v != f) dfs2(e[i].v, u);
  }
  bool check(int a, int b) {
    bool res = 0;
    if (dep[a] > dep[b]) swap(a, b);
    for (int i = (20); i >= (0); --i)
      if (dep[a] <= dep[b] - (1 << i)) res |= mrk[b][i], b = pre[b][i];
    if (a == b) return res | mrk[a][0];
    for (int i = (20); i >= (0); --i)
      if (pre[a][i] != pre[b][i])
        res |= mrk[a][i] | mrk[b][i], a = pre[a][i], b = pre[b][i];
    return res | mrk[a][1] | mrk[b][1];
  }
} rst;
struct graph {
  int head[maxn];
  graph() { memset(head, -1, sizeof(head)); }
  void adde(int u, int v) {
    e.push_back((edge){v, head[u]});
    head[u] = e.size() - 1;
    e.push_back((edge){u, head[v]});
    head[v] = e.size() - 1;
  }
  void tarjan(int u) {
    dfn[u] = low[u] = ++idx;
    sta[++top] = u;
    for (int i = head[u]; ~i; i = e[i].nxt) {
      int v = e[i].v;
      if (!dfn[v]) {
        tarjan(v);
        low[u] = min(low[u], low[v]);
        if (low[v] == dfn[u]) {
          int t = -1;
          bcc++;
          while (t != v) {
            t = sta[top--];
            rst.adde(bcc, t);
          }
          rst.adde(bcc, u);
        }
      } else
        low[u] = min(low[u], dfn[v]);
    }
  }
} G;
struct union_find_set {
  int fa[maxn], xr[maxn];
  int find(int u) {
    if (u == fa[u]) return u;
    int f = fa[u];
    fa[u] = find(fa[u]);
    xr[u] ^= xr[f];
    return fa[u];
  }
  void work() {
    for (int i = (1); i <= (n); ++i) fa[i] = i;
    for (int i = (1); i <= (m); ++i) {
      int u = _u[i];
      int v = _v[i];
      int fu = find(u);
      int fv = find(v);
      if (fu == fv) {
        if (xr[u] == xr[v]) {
          if (dep[u] > dep[v]) swap(u, v);
          mrk[pre[v][0]][0] = 1;
        }
      } else
        fa[fu] = fv, xr[fu] = xr[u] ^ xr[v] ^ 1;
    }
  }
} ufs;
vector<int> S;
void sol() {
  for (int i = (1); i <= (n); ++i)
    if (!dfn[i]) G.tarjan(i);
  for (int i = (1); i <= (n); ++i)
    if (!dep[i]) S.push_back(i), rst.dfs(i, 0);
  ufs.work();
  for (int i = (0); i <= ((int)S.size() - 1); ++i) rst.dfs2(S[i], 0);
  rd(q);
  while (q--) {
    int u, v;
    rd(u), rd(v);
    if (ufs.find(u) != ufs.find(v)) {
      puts("No");
      continue;
    }
    if (ufs.xr[u] != ufs.xr[v])
      puts("Yes");
    else if (rst.check(u, v))
      puts("Yes");
    else
      puts("No");
  }
}
int main() {
  rd(n), rd(m);
  bcc = n;
  for (int i = (1); i <= (m); ++i) {
    rd(_u[i]), rd(_v[i]);
    G.adde(_u[i], _v[i]);
  }
  sol();
  return 0;
}
