#include <iostream> using namespace std; const int stala=1300010; const int stala2=3e5+10; int ile; //f&u int ojciec[stala]; int gl[stala]; int ile_wykreslonych[stala]; int ile_polaczen[stala]; int ilosc[stala]; bool czy_wykreslone[stala]; int id[stala2]; int Find(int x) { if(ojciec[x]==x){ return x; } else{ ojciec[x]=Find(ojciec[x]); return ojciec[x]; } } void Union(int x,int y) { x=Find(x); y=Find(y); if(x!=y){ if(gl[x]>gl[y]){ ojciec[y]=x; ile_polaczen[x]+=ile_polaczen[y]; ile_wykreslonych[x]+=ile_wykreslonych[y]; ilosc[x]+=ilosc[y]; ile_polaczen[x]++; } else{ if(gl[x]==gl[y]){ gl[y]++; } ojciec[x]=y; ile_polaczen[y]+=ile_polaczen[x]; ile_wykreslonych[y]+=ile_wykreslonych[x]; ilosc[y]+=ilosc[x]; ile_polaczen[y]++; } } else{ ile_polaczen[x]++; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; cin>>ile>>q; int ids=ile; for(int i=1;i<=ile;i++){ ojciec[i]=i; id[i]=i; gl[i]=1; ilosc[i]=1; } for(int i=ile+1;i<=ile+q;i++){ ojciec[i]=i; gl[i]=1; ilosc[i]=1; } for(int i=1;i<=q;i++){ char a; cin>>a; if(a=='+'){ int b,c; cin>>b>>c; if(czy_wykreslone[id[b]]==1){ ids++; id[b]=ids; } if(czy_wykreslone[id[c]]==1){ ids++; id[c]=ids; } b=id[b]; c=id[c]; Union(b,c); } else if(a=='-'){ int b; cin>>b; b=id[b]; czy_wykreslone[b]=1; b=Find(b); ile_wykreslonych[b]++; } else{ int b; cin>>b; b=id[b]; if(czy_wykreslone[b]==1){ cout<<'0'; } else{ b=Find(b); if(ilosc[b]==ile_polaczen[b]){ cout<<'1'; } else{ if(ile_wykreslonych[b]==ilosc[b]-1){ cout<<'0'; } else{ cout<<'?'; } } } } } 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 124 125 | #include <iostream> using namespace std; const int stala=1300010; const int stala2=3e5+10; int ile; //f&u int ojciec[stala]; int gl[stala]; int ile_wykreslonych[stala]; int ile_polaczen[stala]; int ilosc[stala]; bool czy_wykreslone[stala]; int id[stala2]; int Find(int x) { if(ojciec[x]==x){ return x; } else{ ojciec[x]=Find(ojciec[x]); return ojciec[x]; } } void Union(int x,int y) { x=Find(x); y=Find(y); if(x!=y){ if(gl[x]>gl[y]){ ojciec[y]=x; ile_polaczen[x]+=ile_polaczen[y]; ile_wykreslonych[x]+=ile_wykreslonych[y]; ilosc[x]+=ilosc[y]; ile_polaczen[x]++; } else{ if(gl[x]==gl[y]){ gl[y]++; } ojciec[x]=y; ile_polaczen[y]+=ile_polaczen[x]; ile_wykreslonych[y]+=ile_wykreslonych[x]; ilosc[y]+=ilosc[x]; ile_polaczen[y]++; } } else{ ile_polaczen[x]++; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; cin>>ile>>q; int ids=ile; for(int i=1;i<=ile;i++){ ojciec[i]=i; id[i]=i; gl[i]=1; ilosc[i]=1; } for(int i=ile+1;i<=ile+q;i++){ ojciec[i]=i; gl[i]=1; ilosc[i]=1; } for(int i=1;i<=q;i++){ char a; cin>>a; if(a=='+'){ int b,c; cin>>b>>c; if(czy_wykreslone[id[b]]==1){ ids++; id[b]=ids; } if(czy_wykreslone[id[c]]==1){ ids++; id[c]=ids; } b=id[b]; c=id[c]; Union(b,c); } else if(a=='-'){ int b; cin>>b; b=id[b]; czy_wykreslone[b]=1; b=Find(b); ile_wykreslonych[b]++; } else{ int b; cin>>b; b=id[b]; if(czy_wykreslone[b]==1){ cout<<'0'; } else{ b=Find(b); if(ilosc[b]==ile_polaczen[b]){ cout<<'1'; } else{ if(ile_wykreslonych[b]==ilosc[b]-1){ cout<<'0'; } else{ cout<<'?'; } } } } } return 0; } |