#include <cstdio>
using namespace std;
struct nod
{
    int x;
    nod *u;
};
struct list
{
    int x,y;
    list *u;
};
nod *a[100000];
list *prim= new list,*ultim,*r;
void add(int x, int y)
{
    nod *q = new nod;
    q->x = y;
    q->u = a[x];
    a[x] = q;
    q->x = x;
    q->u = a[y];
    a[y] = q;
}
void remove(int f)
{
    int i;
    list *d,*q=prim;
    if (f==1) prim=prim->u;
    else
    {
        --f;
        for(i=1;i<f;++i)
        q=q->u;
        d=q->u;
        q->u=q->u->u;
        delete d;
    }
}
short caut(int x, int y)
{
    list *q=prim;
    while(q!=ultim)
    {
        if (((q->x<x)||(q->x>y))||((q->y<x)||(q->y>y))) return 0;
        q=q->u;
    }
    return 1;
}
int main()
{
    int n,m,i,f,x,y;
    short e;
    scanf("%d%d",&n,&m);
    ultim=prim;
    for(i=0;i<m;++i)
    {
        scanf("%hd",&e);
        if (e==1)
        {
            r=new list;
            scanf("%d%d",&ultim->x,&ultim->y);
            add(ultim->x,ultim->y);
            ultim->u=r;
            ultim=r;

        }
        else
        if (e==2)
        {
            scanf("%d",&f);
            remove(f);
        }
        else
        {
            scanf("%d%d",&x,&y);
            if (caut(x,y)==1) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}