#include<bits/stdc++.h>
using namespace std;
int dset[300005];
int Size[300005];
int stan[300005];
int n;
int find(int a)
{
if(dset[a]!=a) dset[a]=find(dset[a]);
return dset[a];
}
void unite(int a, int b)
{
if(Size[a] > Size[b]){
dset[b] = a;
Size[a]+=Size[b];
Size[b]=1;
}
else{
dset[a] = b;
Size[b]+=Size[a];
Size[a]=1;
}
}
void del(int a)
{
if(find(a)!=a){
for(int i=0; i<n+2; i++){
if(dset[i]==a) find(i);
}
Size[find(a)]--;
if(Size[find(a)]==1&&stan[find(a)]==1){
stan[find(a)]=0;
}
dset[a]=a;
stan[a]=0;
find(a);
return;
}
else{
int p=-1;
for(int i=0; i<n+2; i++){
if(find(i)==a&&i!=a){
p=i;
break;
}
}
if(p==-1){
stan[a]=0;
Size[a]=1;
return;
}
for(int i=0; i<n+2; i++){
if(find(i)==a&&i!=a) dset[i]=p;
}
Size[p]=Size[a]-1;
stan[p]=stan[a];
if(stan[p]==1&&Size[p]==1) stan[p]=0;
Size[a]=1;
stan[a]=0;
return;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
int q;
cin>>n>>q;
for(int i=0; i<n+2; ++i){
dset[i]=i;
Size[i]=1;
}
for(int i=0; i<q; i++){
char c;
cin>>c;
if(c=='?'){
int a;
cin>>a;
if(stan[find(a)]==0) cout<<'0';
if(stan[find(a)]==1) cout<<'?';
if(stan[find(a)]==2) cout<<'1';
}
if(c=='+'){
int a, b;
cin>>a>>b;
if(a==b){
stan[find(a)]=2;
continue;
}
if(find(a)==find(b)){
stan[find(a)]=2;
}
else{
int pom=1;
if(stan[find(a)]==2||stan[find(b)]==2) pom=2;
unite(find(a), find(b));
stan[find(a)]=pom;
}
}
if(c=='-'){
int a;
cin>>a;
del(a);
}
}
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 | #include<bits/stdc++.h> using namespace std; int dset[300005]; int Size[300005]; int stan[300005]; int n; int find(int a) { if(dset[a]!=a) dset[a]=find(dset[a]); return dset[a]; } void unite(int a, int b) { if(Size[a] > Size[b]){ dset[b] = a; Size[a]+=Size[b]; Size[b]=1; } else{ dset[a] = b; Size[b]+=Size[a]; Size[a]=1; } } void del(int a) { if(find(a)!=a){ for(int i=0; i<n+2; i++){ if(dset[i]==a) find(i); } Size[find(a)]--; if(Size[find(a)]==1&&stan[find(a)]==1){ stan[find(a)]=0; } dset[a]=a; stan[a]=0; find(a); return; } else{ int p=-1; for(int i=0; i<n+2; i++){ if(find(i)==a&&i!=a){ p=i; break; } } if(p==-1){ stan[a]=0; Size[a]=1; return; } for(int i=0; i<n+2; i++){ if(find(i)==a&&i!=a) dset[i]=p; } Size[p]=Size[a]-1; stan[p]=stan[a]; if(stan[p]==1&&Size[p]==1) stan[p]=0; Size[a]=1; stan[a]=0; return; } } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); int q; cin>>n>>q; for(int i=0; i<n+2; ++i){ dset[i]=i; Size[i]=1; } for(int i=0; i<q; i++){ char c; cin>>c; if(c=='?'){ int a; cin>>a; if(stan[find(a)]==0) cout<<'0'; if(stan[find(a)]==1) cout<<'?'; if(stan[find(a)]==2) cout<<'1'; } if(c=='+'){ int a, b; cin>>a>>b; if(a==b){ stan[find(a)]=2; continue; } if(find(a)==find(b)){ stan[find(a)]=2; } else{ int pom=1; if(stan[find(a)]==2||stan[find(b)]==2) pom=2; unite(find(a), find(b)); stan[find(a)]=pom; } } if(c=='-'){ int a; cin>>a; del(a); } } return 0; } |
English