#include <bits/stdc++.h>
using namespace std;
const int max_n = 1e5 + 10;
vector<long long> adj[max_n];
long long par[max_n], st[max_n], p[max_n], ft[max_n], doc[max_n], x[max_n],
    l[max_n], r[max_n], cnt, tmp, k, n, m;
bool mark[max_n];
int get_par(int u) { return par[u] == u ? u : par[u] = get_par(par[u]); }
void dfs(long long v) {
  st[v] = cnt++;
  for (auto u : adj[v]) dfs(u);
  ft[v] = cnt;
}
bool cmp(long long v, long long u) {
  if (get_par(v) == get_par(u) && st[v] >= st[u] && ft[v] <= ft[u])
    return true;
  else
    return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    par[i] = i;
    p[i] = i;
  }
  while (m--) {
    int t;
    cin >> t;
    long long v, u;
    if (t == 1) {
      cin >> v >> u;
      par[v] = u;
      p[v] = u;
    } else if (t == 2) {
      cin >> v;
      l[tmp] = v;
      r[tmp++] = get_par(v);
    } else {
      cin >> x[k] >> doc[k];
      doc[k++]--;
    }
  }
  for (int i = 1; i <= n; ++i) {
    if (p[i] != i) adj[p[i]].push_back(i);
  }
  for (int i = 1; i <= n; ++i) {
    if (p[i] == i) {
      cnt = 0;
      dfs(i);
    }
  }
  for (int i = 0; i < k; ++i) {
    if (cmp(l[doc[i]], x[i]) && cmp(x[i], r[doc[i]]))
      cout << "YES" << endl;
    else
      cout << "NO" << endl;
  }
  return 0;
}
