#include<bits/stdc++.h> using namespace std; vector<int>V[1300009]; int spojna[300009],numer[300009]; bool duppa[300009]; int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,q,h; cin>>n>>q; h=n; for(int i=1;i<=n;i++) { spojna[i]=i; numer[i]=0; V[i]={i}; } for(int i=1;i<=q;i++) { char z; cin>>z; if(z=='?') { int v; cin>>v; if(duppa[v]){cout<<1;} else if(V[spojna[v]].size()==1){cout<<0;} else{cout<<'?';} } else if(z=='+') { int a,b; cin>>a>>b; if(duppa[b]){swap(a,b);} if(duppa[a]||spojna[a]==spojna[b]) { int u=spojna[b]; for(int v : V[u]) { duppa[v]=1; } V[u].clear(); } else { if(spojna[a]<spojna[b]){swap(a,b);} int u1=spojna[a],u2=spojna[b]; for(int v : V[u2]) { spojna[v]=u1; numer[v]=V[u1].size(); V[u1].push_back(v); } V[u2].clear(); } } else if(z=='-') { int v,u; cin>>v; u=spojna[v]; if(V[u].size()==1){continue;} if(duppa[v]) { duppa[v]=0; h++; V[h]={v}; spojna[v]=h; numer[v]=0; continue; } if(numer[v]==V[u].size()-1) { V[u].pop_back(); } else { numer[V[u].back()]=numer[v]; swap(V[u][V[u].size()-1],V[u][numer[v]]); V[u].pop_back(); } h++; spojna[v]=h; numer[v]=0; V[h]={v}; } } cout<<'\n'; 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 | #include<bits/stdc++.h> using namespace std; vector<int>V[1300009]; int spojna[300009],numer[300009]; bool duppa[300009]; int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,q,h; cin>>n>>q; h=n; for(int i=1;i<=n;i++) { spojna[i]=i; numer[i]=0; V[i]={i}; } for(int i=1;i<=q;i++) { char z; cin>>z; if(z=='?') { int v; cin>>v; if(duppa[v]){cout<<1;} else if(V[spojna[v]].size()==1){cout<<0;} else{cout<<'?';} } else if(z=='+') { int a,b; cin>>a>>b; if(duppa[b]){swap(a,b);} if(duppa[a]||spojna[a]==spojna[b]) { int u=spojna[b]; for(int v : V[u]) { duppa[v]=1; } V[u].clear(); } else { if(spojna[a]<spojna[b]){swap(a,b);} int u1=spojna[a],u2=spojna[b]; for(int v : V[u2]) { spojna[v]=u1; numer[v]=V[u1].size(); V[u1].push_back(v); } V[u2].clear(); } } else if(z=='-') { int v,u; cin>>v; u=spojna[v]; if(V[u].size()==1){continue;} if(duppa[v]) { duppa[v]=0; h++; V[h]={v}; spojna[v]=h; numer[v]=0; continue; } if(numer[v]==V[u].size()-1) { V[u].pop_back(); } else { numer[V[u].back()]=numer[v]; swap(V[u][V[u].size()-1],V[u][numer[v]]); V[u].pop_back(); } h++; spojna[v]=h; numer[v]=0; V[h]={v}; } } cout<<'\n'; return 0; } |