#include <bits/stdc++.h> using namespace std; bool vis[301000]; int nr[2001000]; int sise[2001000]; const int MAKS=300001; int wind(int x) { if(nr[x]!=x)return nr[x]=wind(nr[x]); return x; } int main() { int n,q,a,b,counter=MAKS; string s=""; cin>>n>>q; for(int i=MAKS+1;i<=2*1e6;i++)nr[i]=i; for(int i=0;i<q;i++) { char c; cin>>c; if(c=='+') { cin>>a>>b; if(a==b) { if(wind(a))vis[wind(a)]=true; else { counter++; nr[a]=counter; vis[counter]=true; sise[counter]++; } } else if(wind(a)==wind(b) && wind(a)) { vis[wind(a)]=true; } else if(!wind(a) && !wind(b)) { counter++; nr[a]=counter; nr[b]=counter; sise[counter]+=2; } else { if(wind(a) && !wind(b)) { sise[wind(a)]++; nr[b]=wind(a); } else if(!wind(a) && wind(b)) { sise[wind(b)]++; nr[a]=wind(b); } else { sise[wind(b)]+=sise[wind(a)]; vis[wind(b)]=max(vis[wind(b)],vis[wind(a)]); nr[wind(a)]=wind(b); } } } else if(c=='?') { cin>>a; //cout<<a<<"DAS"<<wind(a)<<endl; if(vis[wind(a)])s+='1'; else if(wind(a)>0 && sise[wind(a)]>1)s+='?'; else s+='0'; } else { cin>>a; sise[wind(a)]--; nr[a]=0; } } cout<<s; }
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 | #include <bits/stdc++.h> using namespace std; bool vis[301000]; int nr[2001000]; int sise[2001000]; const int MAKS=300001; int wind(int x) { if(nr[x]!=x)return nr[x]=wind(nr[x]); return x; } int main() { int n,q,a,b,counter=MAKS; string s=""; cin>>n>>q; for(int i=MAKS+1;i<=2*1e6;i++)nr[i]=i; for(int i=0;i<q;i++) { char c; cin>>c; if(c=='+') { cin>>a>>b; if(a==b) { if(wind(a))vis[wind(a)]=true; else { counter++; nr[a]=counter; vis[counter]=true; sise[counter]++; } } else if(wind(a)==wind(b) && wind(a)) { vis[wind(a)]=true; } else if(!wind(a) && !wind(b)) { counter++; nr[a]=counter; nr[b]=counter; sise[counter]+=2; } else { if(wind(a) && !wind(b)) { sise[wind(a)]++; nr[b]=wind(a); } else if(!wind(a) && wind(b)) { sise[wind(b)]++; nr[a]=wind(b); } else { sise[wind(b)]+=sise[wind(a)]; vis[wind(b)]=max(vis[wind(b)],vis[wind(a)]); nr[wind(a)]=wind(b); } } } else if(c=='?') { cin>>a; //cout<<a<<"DAS"<<wind(a)<<endl; if(vis[wind(a)])s+='1'; else if(wind(a)>0 && sise[wind(a)]>1)s+='?'; else s+='0'; } else { cin>>a; sise[wind(a)]--; nr[a]=0; } } cout<<s; } |