#include<bits/stdc++.h> using namespace std; int gdzie[1310000]; set<int> secik[1310000]; int stan[1310000]; int nowy; int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int n,zap; cin>>n>>zap; nowy=n+1; for(int i=1;i<=n;i++) gdzie[i]=i,secik[i].insert(i),stan[i]=0; while(zap--) { char c; cin>>c; if(c=='?') { int x; cin>>x; if(secik[gdzie[x]].size()>1) cout<<"?"; else cout<<stan[x]; } else if(c=='+') { int x,y; cin>>x>>y; if(gdzie[x]==gdzie[y]) { int cos=gdzie[x]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { stan[*it]=1; gdzie[*it]=*it; secik[*it].insert(*it); } secik[cos].clear(); if(x==y) secik[x].insert(x),gdzie[x]=x,stan[x]=1; } else{ if(secik[gdzie[x]].size()==1 && secik[gdzie[y]].size()==1) { if(stan[x]==1 || stan[y]==1) stan[x]=1,stan[y]=1; else{ gdzie[x]=nowy; gdzie[y]=nowy; secik[x].erase(x); secik[y].erase(y); secik[nowy].insert(y); secik[nowy].insert(x); nowy++; } } else if(secik[gdzie[x]].size()>1 && secik[gdzie[y]].size()>1) { if(secik[gdzie[x]].size()>secik[gdzie[y]].size()) swap(x,y); int cos=gdzie[x]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { gdzie[*it]=gdzie[y]; secik[gdzie[y]].insert(*it); } secik[cos].clear(); } else{ if(secik[gdzie[x]].size()>secik[gdzie[y]].size()) swap(x,y); if(stan[x]==0) { gdzie[x]=gdzie[y]; secik[gdzie[x]].erase(x); secik[gdzie[y]].insert(x); } else{ int cos=gdzie[y]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { stan[*it]=1; gdzie[*it]=*it; secik[*it].insert(*it); } secik[cos].clear(); } } } } else if(c=='-') { int x; cin>>x; if(secik[gdzie[x]].size()==1) stan[x]=0; else{ secik[gdzie[x]].erase(x); if(secik[gdzie[x]].size()==1) { auto it=secik[gdzie[x]].begin(); int y=(*it); secik[gdzie[x]].erase(it); stan[y]=0; secik[x].insert(x); secik[y].insert(y); gdzie[y]=y; gdzie[x]=x; } else{ gdzie[x]=x; secik[x].insert(x); } stan[x]=0; } } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | #include<bits/stdc++.h> using namespace std; int gdzie[1310000]; set<int> secik[1310000]; int stan[1310000]; int nowy; int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int n,zap; cin>>n>>zap; nowy=n+1; for(int i=1;i<=n;i++) gdzie[i]=i,secik[i].insert(i),stan[i]=0; while(zap--) { char c; cin>>c; if(c=='?') { int x; cin>>x; if(secik[gdzie[x]].size()>1) cout<<"?"; else cout<<stan[x]; } else if(c=='+') { int x,y; cin>>x>>y; if(gdzie[x]==gdzie[y]) { int cos=gdzie[x]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { stan[*it]=1; gdzie[*it]=*it; secik[*it].insert(*it); } secik[cos].clear(); if(x==y) secik[x].insert(x),gdzie[x]=x,stan[x]=1; } else{ if(secik[gdzie[x]].size()==1 && secik[gdzie[y]].size()==1) { if(stan[x]==1 || stan[y]==1) stan[x]=1,stan[y]=1; else{ gdzie[x]=nowy; gdzie[y]=nowy; secik[x].erase(x); secik[y].erase(y); secik[nowy].insert(y); secik[nowy].insert(x); nowy++; } } else if(secik[gdzie[x]].size()>1 && secik[gdzie[y]].size()>1) { if(secik[gdzie[x]].size()>secik[gdzie[y]].size()) swap(x,y); int cos=gdzie[x]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { gdzie[*it]=gdzie[y]; secik[gdzie[y]].insert(*it); } secik[cos].clear(); } else{ if(secik[gdzie[x]].size()>secik[gdzie[y]].size()) swap(x,y); if(stan[x]==0) { gdzie[x]=gdzie[y]; secik[gdzie[x]].erase(x); secik[gdzie[y]].insert(x); } else{ int cos=gdzie[y]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { stan[*it]=1; gdzie[*it]=*it; secik[*it].insert(*it); } secik[cos].clear(); } } } } else if(c=='-') { int x; cin>>x; if(secik[gdzie[x]].size()==1) stan[x]=0; else{ secik[gdzie[x]].erase(x); if(secik[gdzie[x]].size()==1) { auto it=secik[gdzie[x]].begin(); int y=(*it); secik[gdzie[x]].erase(it); stan[y]=0; secik[x].insert(x); secik[y].insert(y); gdzie[y]=y; gdzie[x]=x; } else{ gdzie[x]=x; secik[x].insert(x); } stan[x]=0; } } } return 0; } |