#include <bits/stdc++.h>
#define MOD 1000000007
#define Nmax 100005
#define pb push_back
#define mp make_pair
#define INF 2000000000
#define eps 0.000000000001

using namespace std;

multiset <int> St[Nmax],Dr[Nmax];
int a[Nmax],b[Nmax],aint1[3*Nmax],aint2[3*Nmax];

inline void Upd1(int nod, int st, int dr, int p, int val, int t)
{
    if(st==dr)
    {
        if(!t) St[st].insert(-val);
        else St[st].erase(St[st].find(-val));
        if(!St[st].size()) aint1[nod]=-INF;
        else aint1[nod]=-*St[st].begin();
        return;
    }
    int mij=((st+dr)>>1);
    if(p<=mij) Upd1(2*nod,st,mij,p,val,t);
    else Upd1(2*nod+1,mij+1,dr,p,val,t);
    aint1[nod]=max(aint1[2*nod],aint1[2*nod+1]);
}

inline void Upd2(int nod, int st, int dr, int p, int val, int t)
{
    if(st==dr)
    {
        if(!t) Dr[st].insert(val);
        else Dr[st].erase(Dr[st].find(val));
        if(!Dr[st].size()) aint2[nod]=INF;
        else aint2[nod]=*Dr[st].begin();
        return;
    }
    int mij=((st+dr)>>1);
    if(p<=mij) Upd2(2*nod,st,mij,p,val,t);
    else Upd2(2*nod+1,mij+1,dr,p,val,t);
    aint2[nod]=min(aint2[2*nod],aint2[2*nod+1]);
}

inline int Qry1(int nod, int st, int dr, int x, int y)
{
    if(st==x && y==dr) return aint1[nod];
    int mij=((st+dr)>>1);
    if(y<=mij) return Qry1(2*nod,st,mij,x,y);
    else
        if(x>mij) return Qry1(2*nod+1,mij+1,dr,x,y);
        else return max(Qry1(2*nod,st,mij,x,mij),Qry1(2*nod+1,mij+1,dr,mij+1,y));
}

inline int Qry2(int nod, int st, int dr, int x, int y)
{
    if(st==x && y==dr) return aint2[nod];
    int mij=((st+dr)>>1);
    if(y<=mij) return Qry2(2*nod,st,mij,x,y);
    else
        if(x>mij) return Qry2(2*nod+1,mij+1,dr,x,y);
        else return min(Qry2(2*nod,st,mij,x,mij),Qry2(2*nod+1,mij+1,dr,mij+1,y));
}

int main()
{
    int i,j,x,y,l=0,tip,n,m;
    #ifndef ONLINE_JUDGE
        freopen ("date.in","r",stdin);
        freopen ("date.out","w",stdout);
    #endif
    cin.sync_with_stdio(0);
    cin>>n>>m;
    for(i=1;i<3*Nmax;++i)
    {
        aint1[i]=-INF;
        aint2[i]=INF;
    }
    while(m--)
    {
        cin>>tip;
        if(tip==1)
        {
            cin>>x>>y;
            a[++l]=x; b[l]=y;
            Upd1(1,1,n,x,y,0);
            Upd2(1,1,n,y,x,0);
        }
        if(tip==2)
        {
            cin>>x;
            Upd1(1,1,n,a[x],b[x],1);
            Upd2(1,1,n,b[x],a[x],1);
        }
        if(tip==3)
        {
            cin>>x>>y;
            int v1,v2;
            v1=Qry1(1,1,n,x,y); v2=Qry2(1,1,n,x,y);
            //cout<<v1<<" "<<v2<<"\n";
            if(v1>y || v2<x) cout<<"NO\n";
            else cout<<"YES\n";
        }
    }
    return 0;
}