#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T read() {
  register T sum = 0;
  register char cc = getchar();
  int sym = 1;
  while (cc != '-' && (cc > '9' || cc < '0')) cc = getchar();
  if (cc == '-') sym = -1, cc = getchar();
  sum = sum * 10 + cc - '0';
  cc = getchar();
  while (cc >= '0' && cc <= '9') sum = sum * 10 + cc - '0', cc = getchar();
  return sym * sum;
}
template <typename T>
inline T read(T &a) {
  a = read<T>();
  return a;
}
template <typename T, typename... Others>
inline void read(T &a, Others &...b) {
  a = read(a);
  read(b...);
}
struct Edge {
  int v;
  Edge *next;
  Edge(int a = 0, Edge *b = NULL) {
    v = a;
    next = b;
  }
} * head[100010];
struct Node {
  int v;
  int tag;
} node[100010 << 2];
int n, m, Q, cnt, f[100010], x[100010], y[100010], used[100010];
int fa[100010], top[100010], dep[100010], dfn[100010], siz[100010], son[100010];
void Effect(int k, int l, int r, int v) {
  node[k].v += (r - l + 1) * v;
  node[k].tag += v;
}
void down(int k, int l, int r) {
  if (node[k].tag) {
    int mid = (l + r) >> 1;
    Effect(k << 1, l, mid, node[k].tag);
    Effect(k << 1 | 1, mid + 1, r, node[k].tag);
    node[k].tag = 0;
  }
}
void change(int k, int l, int r, int x, int y) {
  if (l >= x && r <= y) {
    Effect(k, l, r, 1);
    return;
  }
  down(k, l, r);
  int mid = (l + r) >> 1;
  if (x <= mid) change(k << 1, l, mid, x, y);
  if (y > mid) change(k << 1 | 1, mid + 1, r, x, y);
  node[k].v = node[k << 1].v + node[k << 1 | 1].v;
}
int query(int k, int l, int r, int x, int y) {
  if (l >= x && r <= y) return node[k].v;
  down(k, l, r);
  int mid = (l + r) >> 1, ans = 0;
  if (x <= mid) ans += query(k << 1, l, mid, x, y);
  if (y > mid) ans += query(k << 1 | 1, mid + 1, r, x, y);
  return ans;
}
void change(int x, int y) {
  while (top[x] != top[y]) {
    if (dep[top[x]] < dep[top[y]]) swap(x, y);
    change(1, 1, n, dfn[top[x]], dfn[x]);
    x = fa[top[x]];
  }
  if (dfn[x] > dfn[y]) swap(x, y);
  if (dfn[x] < dfn[y]) change(1, 1, n, dfn[x] + 1, dfn[y]);
}
bool query(int x, int y) {
  while (top[x] != top[y]) {
    if (dep[top[x]] < dep[top[y]]) swap(x, y);
    if (query(1, 1, n, dfn[top[x]], dfn[x])) return true;
    x = fa[top[x]];
  }
  if (dfn[x] > dfn[y]) swap(x, y);
  if (dfn[x] < dfn[y]) return query(1, 1, n, dfn[x] + 1, dfn[y]);
  return false;
}
void dfs1(int k) {
  siz[k] = 1;
  for (Edge *i = head[k]; i != NULL; i = i->next) {
    if (i->v == fa[k]) continue;
    fa[i->v] = k;
    dep[i->v] = dep[k] + 1;
    dfs1(i->v);
    siz[k] += siz[i->v];
    if (siz[son[k]] < siz[i->v]) son[k] = i->v;
  }
}
void dfs2(int k, int t) {
  top[k] = t;
  dfn[k] = ++cnt;
  if (!son[k]) return;
  dfs2(son[k], t);
  for (Edge *i = head[k]; i != NULL; i = i->next)
    if (i->v != fa[k] && i->v != son[k]) dfs2(i->v, i->v);
}
int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
int main() {
  read(n, m);
  for (int i = 1; i <= n; i++) f[i] = i;
  for (int i = 1; i <= m; i++) {
    read(x[i], y[i]);
    if (find(x[i]) != find(y[i])) {
      head[x[i]] = new Edge(y[i], head[x[i]]);
      head[y[i]] = new Edge(x[i], head[y[i]]);
      f[find(x[i])] = find(y[i]);
      used[i] = true;
    }
  }
  for (int i = 1; i <= n; i++)
    if (!dfn[i]) {
      dfs1(i);
      dfs2(i, i);
    }
  for (int i = 1; i <= m; i++)
    if (!used[i] && !((dep[x[i]] & 1) ^ (dep[y[i]] & 1))) change(x[i], y[i]);
  for (int i = 1; i <= m; i++)
    if (!used[i] && ((dep[x[i]] & 1) ^ (dep[y[i]] & 1)) && query(x[i], y[i]))
      change(x[i], y[i]);
  Q = read<int>();
  for (int i = 1; i <= Q; i++) {
    int x, y;
    read(x, y);
    if (find(x) != find(y) || (!((dep[x] & 1) ^ (dep[y] & 1)) && !query(x, y)))
      puts("No");
    else
      puts("Yes");
  }
  return 0;
}
