#include #include #include #include #include #include #include #include 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(Miv2) printf("NO\n"); else printf("YES\n"); } } return 0; }