#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; } |
English