#include <bits/stdc++.h> using namespace std; const int N = 2e6; int idx[N]; int rep[N], rnk[N], siz[N], edg[N]; int find(int a){ if(rep[a]==a) return a; return rep[a]=find(rep[a]); } void uni(int a, int b){ a=find(a); b=find(b); if(a==b) return; if(rnk[a]<rnk[b]) swap(a, b); edg[a]+=edg[b]; siz[a]+=siz[b]; rep[b]=rep[a]; rnk[a]++; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; for(int i=1; i<=n; i++){ idx[i]=i; rep[i]=i; siz[i]=1; } for(int i=0; i<q; i++){ char o; cin >> o; int a, b; if(o=='+'){ cin >> a >> b; a=idx[a]; b=idx[b]; uni(a, b); edg[find(a)]++; }else if(o=='-'){ cin >> a; b=find(idx[a]); siz[b]--; edg[b]--; n++; idx[a]=n; rep[n]=n; siz[n]=1; }else{ cin >> a; a=find(idx[a]); if(edg[a]==0){ cout << '0'; }else if(edg[a]==siz[a]){ cout << '1'; }else{ cout << '?'; } } } 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 | #include <bits/stdc++.h> using namespace std; const int N = 2e6; int idx[N]; int rep[N], rnk[N], siz[N], edg[N]; int find(int a){ if(rep[a]==a) return a; return rep[a]=find(rep[a]); } void uni(int a, int b){ a=find(a); b=find(b); if(a==b) return; if(rnk[a]<rnk[b]) swap(a, b); edg[a]+=edg[b]; siz[a]+=siz[b]; rep[b]=rep[a]; rnk[a]++; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; for(int i=1; i<=n; i++){ idx[i]=i; rep[i]=i; siz[i]=1; } for(int i=0; i<q; i++){ char o; cin >> o; int a, b; if(o=='+'){ cin >> a >> b; a=idx[a]; b=idx[b]; uni(a, b); edg[find(a)]++; }else if(o=='-'){ cin >> a; b=find(idx[a]); siz[b]--; edg[b]--; n++; idx[a]=n; rep[n]=n; siz[n]=1; }else{ cin >> a; a=find(idx[a]); if(edg[a]==0){ cout << '0'; }else if(edg[a]==siz[a]){ cout << '1'; }else{ cout << '?'; } } } cout << '\n'; return 0; } |