#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
std::ostream &operator<<(std::ostream &os, const std::pair<T1, T2> &v) {
  os << "(" << v.first << "," << v.second << ")";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &v) {
  for (__typeof(v.begin()) x = v.begin(); x != v.end(); x++) {
    os << *x << ",";
  }
  return os;
}
long long mod = 1000000007;
const long double pi = 3.14159265358979323846264338327950288419716939937510;
inline void fm(long long &a, long long &m = mod) {
  a %= m;
  if (a < 0) a += m;
}
inline long long po(long long a, long long b, long long &m = mod) {
  long long res = 1 % m;
  fm(a, m);
  for (; b; b >>= 1) {
    if (b & (1LL)) res = res * a % m;
    a = a * a % m;
  }
  return res;
}
inline long long inv(long long a, long long &m = mod) {
  fm(a, m);
  return po(a, m - 2, m);
}
const long double eps = 1e-10;
const int oo = 1000000009;
const long long ooo = 2e18 + 5;
long long sl() {
  int c = getchar();
  while ((c < '0' || c > '9') && c != '-') {
    c = getchar();
  }
  bool sign = 0;
  if (c == '-') {
    sign = 1;
    c = getchar();
  }
  long long ret = 0;
  while (c >= '0' && c <= '9') {
    ret = 10 * ret + c - 48;
    c = getchar();
  }
  if (sign) return -ret;
  return ret;
}
int ss(char *s) {
  int n = 0;
  int c = getchar();
  while (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) c = getchar();
  while (((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {
    s[n] = (char)(c);
    n++;
    c = getchar();
  }
  return n;
}
int p[200005];
int find(int x) {
  if (p[x] == x) return x;
  return p[x] = find(p[x]);
}
set<int> a;
int main() {
  srand((unsigned int)time(0));
  int n = sl();
  int q = sl();
  for (int i = 1; i <= n; i++) {
    a.insert(i);
    p[i] = i;
  }
  while (q-- > 0) {
    int ty = sl();
    int x = sl();
    int y = sl();
    if (ty == 3) {
      x = *a.lower_bound(x);
      y = *a.lower_bound(y);
      if (find(x) != find(y))
        printf("NO\n");
      else
        printf("YES\n");
    } else if (ty == 1) {
      x = *a.lower_bound(x);
      y = *a.lower_bound(y);
      x = find(x);
      y = find(y);
      ;
      if (x > y) swap(x, y);
      if (x != y) p[x] = y;
    } else if (ty == 2) {
      set<int>::iterator it1 = a.lower_bound(x);
      set<int>::iterator it2 = a.lower_bound(y);
      int p1 = find(*it2);
      vector<int> d;
      while (it1 != it2) {
        p[find(*it1)] = p1;
        d.push_back(*it1);
        it1++;
      }
      for (int i = 0; i < d.size(); i++) {
        a.erase(d[i]);
      }
    }
  }
  return 0;
}
