//neterminata...............................................
#include<stdio.h>
#include<set>
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 <int> 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]<vmax[2*nod+1]) || (vmax[nod]==inf)) && (vmax[2*nod+1]!=inf))
            vmax[nod]=vmax[2*nod+1];
        if (((vmin[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 (((rmax<vmax[nod])||(rmax==-1)) && (vmax[nod]!=inf))
            rmax=vmax[nod];
        if (((rmin>vmin[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;
}