#include<cstdio>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cstring>
#include<queue>
#include<set>
using namespace std;
int p,nr,tip,i,n,m,v1,v2,Mi,Ma,x[400009],y[400009],mi[400009],ma[400009];
multiset < int > a[100009];
void U(int nod,int st,int dr,int poz,int val1,int val2)
{
    if(st==dr)
    {
        mi[nod]=val1;
        ma[nod]=val2;
        return ;
    }
    int mij=(st+dr)>>1;
    if(poz<=mij) U(nod<<1,st,mij,poz,val1,val2);
    else U((nod<<1)+1,mij+1,dr,poz,val1,val2);
}
void Q(int nod,int st,int dr,int x,int y)
{
    if(x<=st&&dr<=y)
    {
        Mi=min(Mi,mi[nod]);
        Ma=max(Ma,ma[nod]);
        return ;
    }
    int mij=(st+dr)>>1;
    if(x<=mij) Q(nod<<1,st,mij,x,y);
    if(y>mij) Q((nod<<1)+1,mij+1,dr,x,y);
}
int main()
{
//freopen("input","r",stdin);
//freopen("output","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
    U(1,1,n,i,100000,-100000);
for(i=1;i<=m;i++)
{
    scanf("%d",&tip);
    if(tip==1)
    {
        nr++;
        scanf("%d",&x[nr]);
        scanf("%d",&y[nr]);
        a[x[nr]].insert(y[nr]);
        a[y[nr]].insert(x[nr]);
        p=nr;
        if(!a[x[p]].empty())
        {
            v1=(*(a[x[p]].begin()));
            v2=(*(a[x[p]].rbegin()));
        }
        else
        {
            v1=1000000;
            v2=-1000000;
        }
        U(1,1,n,x[p],v1,v2);
        if(!a[y[p]].empty())
        {
            v1=(*(a[y[p]].begin()));
            v2=(*(a[y[p]].rbegin()));
        }
        else
        {
            v1=1000000;
            v2=-1000000;
        }
        U(1,1,n,y[p],v1,v2);
    }
    else
    if(tip==2)
    {
        scanf("%d",&p);
        a[x[p]].erase(a[x[p]].find(y[p]));
        a[y[p]].erase(a[y[p]].find(x[p]));
        if(!a[x[p]].empty())
        {
            v1=(*(a[x[p]].begin()));
            v2=(*(a[x[p]].rbegin()));
        }
        else
        {
            v1=1000000;
            v2=-1000000;
        }
        U(1,1,n,x[p],v1,v2);
        if(!a[y[p]].empty())
        {
            v1=(*(a[y[p]].begin()));
            v2=(*(a[y[p]].rbegin()));
        }
        else
        {
            v1=1000000;
            v2=-1000000;
        }
        U(1,1,n,y[p],v1,v2);
    }
    else
    {
        scanf("%d",&v1);
        scanf("%d",&v1);
        Mi=1000000;
        Ma=-1000000;
        Q(1,1,n,v1,v2);
        if(Mi<v1||Ma>v2) printf("NO\n");
        else printf("YES\n");
    }
}
return 0;
}