#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000 + 10, MAXM = 400000 + 10;

struct Node {
  set<int> S;
  int mx, mn;
} T[MAXN << 2];

int n, m;

#define lson (rt<<1)
#define rson (rt<<1|1)
void upd(int rt) {
  T[rt].mx = max(T[lson].mx, T[rson].mx);
  T[rt].mn = min(T[lson].mn, T[rson].mn);
}
void build(int rt, int l, int r) {
  if (l + 1 == r) {
    T[rt].S.insert(l);
    T[rt].mx = T[rt].mn = l;
    return;
  }
  int m = (l + r) >> 1;
  build(lson, l, m);
  build(rson, m, r);
  upd(rt);
}
void ins(int rt, int l, int r, int x, int y, int o) {
  if (l + 1 == r) {
    if (o) T[rt].S.insert(y);
    else T[rt].S.erase(y);
    T[rt].mx = *T[rt].S.rbegin();
    T[rt].mn = *T[rt].S.begin();
    return;
  }
  int m = (l + r) >> 1;
  if (x < m) ins(lson, l, m, x, y, o);
  else ins(rson, m, r, x, y, o);
  upd(rt);
}
int MX, MN;
void ask(int rt, int l, int r, int L, int R) {
  if (L <= l && R >= r) {
    MX = max(MX, T[rt].mx);
    MN = min(MN, T[rt].mn);
    return;
  }
  int m = (l + r) >> 1;
  if (L < m) ask(lson, l, m, L, R);
  if (R > m) ask(rson, m, r, L, R);
}

int main() {
  scanf("%d%d", &n, &m);
  build(1, 0, n);
  static int x[MAXM], y[MAXM], s(0);
  for (int i = 0; i < m; ++ i) {
    int op, a, b; scanf("%d", &op);
    if (op == 1) {
      scanf("%d%d", &a, &b);
      x[++ s] = --a; y[s] = --b;
      ins(1, 0, n, a, b, 1);
      ins(1, 0, n, b, a, 1);
    } else if (op == 2) {
      scanf("%d", &a);
      ins(1, 0, n, x[a], y[a], 0);
      ins(1, 0, n, y[a], x[a], 0);
    } else if (op == 3) {
      scanf("%d%d", &a, &b);
      MX = a - 1, MN = b - 1;
      ask(1, 0, n, a - 1, b);
      if (MX > b - 1 || MN < a - 1) puts("NO");
      else puts("YES");
    }
  }
  return 0;
}