#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;
struct Edge {
  int next, v;
  Edge() {}
  Edge(int next, int v) : next(next), v(v) {}
} e[maxn << 1];
struct Node {
  int val, pos;
  Node() {}
  Node(int val, int pos) : val(val), pos(pos) {}
};
int n, m;
int head[maxn], cnt;
int dfn[maxn], low[maxn], timer;
int dep[maxn], dfs_seq[maxn];
int vis[maxn], num;
int anc[maxn][20];
int dis[maxn][20];
int st[maxn << 1], top;
int bcc_cnt;
set<int> bcc[maxn];
bool odd[maxn], up[maxn], used[maxn << 1];
inline int read() {
  int x = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') ch = getchar();
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x;
}
inline void AddEdge(int u, int v) {
  e[++cnt] = Edge(head[u], v);
  head[u] = cnt;
  e[++cnt] = Edge(head[v], u);
  head[v] = cnt;
}
void dfs(int u, int fa = 0) {
  vis[dfs_seq[++timer] = u] = num;
  dfn[u] = low[u] = timer;
  for (int i = head[u]; i; i = e[i].next) {
    int v = e[i].v;
    if (!dfn[v]) {
      dep[v] = dep[u] + 1;
      anc[v][0] = u;
      st[++top] = i;
      dfs(v, u);
      low[u] = min(low[u], low[v]);
      if (low[v] >= dfn[u]) {
        ++bcc_cnt;
        int pos;
        do {
          pos = st[top--];
          bcc[bcc_cnt].insert(e[pos].v);
          bcc[bcc_cnt].insert(e[pos ^ 1].v);
          if (used[pos] || used[pos ^ 1]) odd[bcc_cnt] = 1;
        } while (pos != i);
      }
    } else if (dfn[v] < dfn[u] && v != fa) {
      st[++top] = i;
      low[u] = min(low[u], dfn[v]);
      if (!((dep[u] - dep[v]) & 1)) used[i] = used[i ^ 1] = 1;
    }
  }
}
inline Node LCA(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  int res = 0, h = dep[u] - dep[v], d = 0;
  while (h) {
    if (h & 1) res += dis[u][d], u = anc[u][d];
    d++, h >>= 1;
  }
  if (u == v) return Node(res, u);
  for (int i = 18; i >= 0; i--)
    if (anc[u][i] != anc[v][i]) {
      res += dis[u][i] + dis[v][i];
      u = anc[u][i], v = anc[v][i];
    }
  return Node(res + dis[u][0] + dis[v][0], anc[u][0]);
}
int main() {
  if (fopen("sunset.in", "r") != NULL) {
    freopen("sunset.in", "r", stdin);
    freopen("sunset.out", "w", stdout);
  }
  cnt = 1;
  n = read(), m = read();
  for (int i = 1; i <= m; i++) AddEdge(read(), read());
  for (int i = 1; i <= n; i++)
    if (!vis[i]) {
      num++;
      dep[i] = 1;
      dfs(i);
    }
  for (int i = 1; i <= bcc_cnt; i++)
    if (odd[i])
      for (set<int>::iterator SB = bcc[i].begin(); SB != bcc[i].end(); SB++) {
        int u = *SB;
        up[u] = bcc[i].find(anc[u][0]) != bcc[i].end();
      }
  for (int i = 1; i <= n; i++) {
    int u = dfs_seq[i];
    dis[u][0] = up[u];
    for (int j = 0; anc[anc[u][j]][j]; j++) {
      anc[u][j + 1] = anc[anc[u][j]][j];
      dis[u][j + 1] = dis[anc[u][j]][j] + dis[u][j];
    }
  }
  int q = read(), x, y;
  while (q--) {
    x = read(), y = read();
    if (vis[x] != vis[y] || x == y) {
      puts("No");
      continue;
    }
    Node cur = LCA(x, y);
    int lca = cur.pos;
    if ((dep[x] + dep[y] - 2 * dep[lca]) & 1) {
      puts("Yes");
      continue;
    }
    if (cur.val)
      puts("Yes");
    else
      puts("No");
  }
  return 0;
}
