//neterminata............................................... #include #include using namespace std; #define nmax 100005 #define mmax 400005 #define inf 0 //??? struct element{int a, b;}; int poz, n, p1, rez, a, b, op, i, ii, j, m, xmax, xmin, rmax, rmin, ne, x; multiset mamax[nmax], mamin[nmax]; int vmax[nmax*4], vmin[nmax*4]; //????? element v[mmax]; bool ok; void update(int st, int dr, int nod) { if (st==dr) { vmax[nod]=xmax; vmin[nod]=xmin; } else { int mij=(st+dr)/2; if (poz<=mij) update(st,mij,2*nod); else update(mij+1,dr,2*nod+1); vmax[nod]=vmax[2*nod]; vmin[nod]=vmin[2*nod]; if (((vmax[nod]vmin[2*nod+1]) || (vmin[nod]==inf)) && (vmin[2*nod+1]!=inf)) vmin[nod]=vmin[2*nod+1]; } } void query(int st, int dr, int nod) { if ((a<=st)&&(dr<=b)) { if (((rmaxvmin[nod])||(rmin==-1)) && (vmin[nod]!=inf)) rmin=vmin[nod]; } else { int mij=(st+dr)/2; if (a<=mij) query(st,mij,2*nod); if (b>=mij+1) query(mij+1,dr,2*nod+1); } } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf("%ld %ld",&n,&m); for (ii=1;ii<=m;ii++) { scanf("%ld",&op); if (op==1) { scanf("%ld %ld",&a,&b); v[++ne].a=a; v[ne].b=b; mamin[a].insert(b); mamin[b].insert(a); mamax[a].insert(-b); mamax[b].insert(-a); poz=b; xmin=*mamin[b].begin(); xmax=-(*mamax[b].begin()); update(1,n,1); poz=a; xmin=*mamin[a].begin(); xmax=-(*mamax[a].begin()); update(1,n,1); } if (op==2) { scanf("%ld",&x); a=v[x].a; b=v[x].b; mamin[a].erase(b); mamax[a].erase(-b); poz=a; xmin=xmax=inf; if (mamin[a].size()>0) { xmin=*mamin[a].begin(); xmax=-(*mamax[a].begin()); } update(1,n,1); mamin[b].erase(a); mamax[b].erase(-a); poz=b; xmin=xmax=inf; if (mamin[b].size()>0) { xmin=*mamin[b].begin(); xmax=-(*mamax[b].begin()); } update(1,n,1); } if (op==3) { scanf("%ld %ld",&a,&b); ok=1; rmin=rmax=-1; query(1,n,1); if (((rmin>=a)||(rmin==-1))&&((rmax<=b)||(rmax==-1))) ok=1; else ok=0; if (ok) printf("YES\n"); else printf("NO\n"); } } return 0; }