#include<bits/stdc++.h> using namespace std; typedef long double ld; typedef long long ll; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=2e6+7; vector<int>V[LIM]; int F[LIM], czy[LIM], kto[LIM], ile[LIM], n; int fnd(int x) { if(F[x]==x) return x; return F[x]=fnd(F[x]); } void wlacz(int x) { x=fnd(x); vector<int>P=V[x]; for(auto i : P) { V[i].clear(); V[i].pb(i); F[i]=i; czy[i]=1; } } void wylacz(int x) { kto[x]=n; F[n]=n; V[n].pb(n); ile[n]=1; ++n; } void uni(int a, int b) { a=fnd(a); b=fnd(b); if(V[a].size()<V[b].size()) swap(a, b); for(auto i : V[b]) V[a].pb(i); V[b].clear(); ile[a]+=ile[b]; F[b]=a; } void lacz(int a, int b) { if(czy[a]) { if(!czy[b]) wlacz(b); return; } if(czy[b]) { if(!czy[a]) wlacz(a); return; } if(fnd(a)==fnd(b)) wlacz(a); else uni(a, b); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int q; cin >> n >> q; rep(i, n) { F[i]=i; kto[i]=i; ile[i]=1; V[i].pb(i); } while(q--) { char t; cin >> t; if(t=='+') { int a, b; cin >> a >> b; --a; --b; a=kto[a]; b=kto[b]; lacz(a, b); } else if(t=='-') { int a; cin >> a; --a; --ile[fnd(kto[a])]; wylacz(a); } else { int a; cin >> a; --a; a=kto[a]; if(czy[a]) { cout << 1; continue; } cout << (ile[fnd(a)]>1?"?":"0"); } } cout << '\n'; }
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; typedef long double ld; typedef long long ll; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=2e6+7; vector<int>V[LIM]; int F[LIM], czy[LIM], kto[LIM], ile[LIM], n; int fnd(int x) { if(F[x]==x) return x; return F[x]=fnd(F[x]); } void wlacz(int x) { x=fnd(x); vector<int>P=V[x]; for(auto i : P) { V[i].clear(); V[i].pb(i); F[i]=i; czy[i]=1; } } void wylacz(int x) { kto[x]=n; F[n]=n; V[n].pb(n); ile[n]=1; ++n; } void uni(int a, int b) { a=fnd(a); b=fnd(b); if(V[a].size()<V[b].size()) swap(a, b); for(auto i : V[b]) V[a].pb(i); V[b].clear(); ile[a]+=ile[b]; F[b]=a; } void lacz(int a, int b) { if(czy[a]) { if(!czy[b]) wlacz(b); return; } if(czy[b]) { if(!czy[a]) wlacz(a); return; } if(fnd(a)==fnd(b)) wlacz(a); else uni(a, b); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int q; cin >> n >> q; rep(i, n) { F[i]=i; kto[i]=i; ile[i]=1; V[i].pb(i); } while(q--) { char t; cin >> t; if(t=='+') { int a, b; cin >> a >> b; --a; --b; a=kto[a]; b=kto[b]; lacz(a, b); } else if(t=='-') { int a; cin >> a; --a; --ile[fnd(kto[a])]; wylacz(a); } else { int a; cin >> a; --a; a=kto[a]; if(czy[a]) { cout << 1; continue; } cout << (ile[fnd(a)]>1?"?":"0"); } } cout << '\n'; } |