#include using namespace std; const int MAXN = 100000 + 10, MAXM = 400000 + 10; struct Node { set 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; }