#include #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; }