#include <stdio.h>

#define NMAX 100100
#define MMAX 400400

char exists[MMAX];
int edge[MMAX][2], nedges;
int N, M, op, a, b, c, tidx, ok;
int size[NMAX], parent[NMAX], vmin[NMAX], vmax[NMAX], tlast[NMAX], hasany[NMAX];

int Find(int x) {
	int px = x, tx;
	while (parent[px] > 0)
		px = parent[px];
	//while (x != px) {
	//	tx = parent[x];
	//	parent[x] = px;
	//	x = tx;
	//}
	return px;
}

void Union(int x, int y) {
	int tx = Find(x), ty = Find(y);
	if (tx == ty)
		return;
	if (size[tx] >= size[ty]) {
		parent[ty] = tx;
		size[tx] += size[ty];
		if (vmin[ty] < vmin[tx]) vmin[tx] = vmin[ty];
		if (vmax[ty] > vmax[tx]) vmax[tx] = vmax[ty];
		hasany[tx] |= hasany[ty];
		if (vmin[tx] < a && vmax[tx] > a && hasany[tx])
			ok = 0;
		if (vmin[tx] < b && vmax[tx] > b && hasany[tx])
			ok = 0;
	} else {
		parent[tx] = ty;
		size[ty] += size[tx];
		if (vmin[tx] < vmin[ty]) vmin[ty] = vmin[tx];
		if (vmax[tx] > vmax[ty]) vmax[ty] = vmax[tx];
		hasany[ty] |= hasany[tx];
		if (vmin[ty] < a && vmax[ty] > a && hasany[ty])
			ok = 0;
		if (vmin[ty] < b && vmax[ty] > b && hasany[ty])
			ok = 0;
	}
}

int main() {
	scanf("%d %d", &N, &M);

	nedges = tidx = 0;
	for (a = 1; a <= N; a++)
		tlast[a] = 0;

	while (M--) {
		scanf("%d", &op);
		if (op == 1) {
			scanf("%d %d", &a, &b);
			nedges++;
			edge[nedges][0] = a; edge[nedges][1] = b;
			exists[nedges] = 1;
		} else if (op == 2) {
			scanf("%d", &a);
			exists[a] = 0;
		} else {
			scanf("%d %d", &a, &b);
			tidx++;
			ok = 1;
			for (c = 1; c <= nedges && ok; c++)
				if (exists[c]) {
					if (tlast[edge[c][0]] != tidx) {
						tlast[edge[c][0]] = tidx;
						parent[edge[c][0]] = 0;
						size[edge[c][0]] = 1;
						vmin[edge[c][0]] = vmax[edge[c][0]] = edge[c][0];
						hasany[edge[c][0]] = 0;
						if (a <= edge[c][0] && edge[c][0] <= b)
							hasany[edge[c][0]] = 1;
					}
					if (tlast[edge[c][1]] != tidx) {
						tlast[edge[c][1]] = tidx;
						parent[edge[c][1]] = 0;
						size[edge[c][1]] = 1;
						vmin[edge[c][1]] = vmax[edge[c][1]] = edge[c][1];
						hasany[edge[c][1]] = 0;
						if (a <= edge[c][1] && edge[c][1] <= b)
							hasany[edge[c][1]] = 1;
					}

					Union(edge[c][0], edge[c][1]);
				}

			if (ok)
				printf("YES\n");
			else
				printf("NO\n");
		}
	}

	return 0;
}