#include<bits/stdc++.h> using namespace std; typedef pair<pair<int, int>, int> piii; #define r first.first #define ll first.second #define lk second int _f(int a, vector<piii> &uf){ while(uf[a].r != uf[uf[a].r].r){ a = uf[a].r; } return(a); } void _u(int a, int b, vector<piii> &uf){ a = _f(a, uf); b = _f(b, uf); uf[b].r = uf[a].r; uf[a].ll += uf[b].ll; uf[a].lk += uf[b].lk + 1; } void _s(int a, vector<int> &s, vector<piii> &uf, int ts){ for(int i = 0; i < s.size(); i++){ _f(i, uf); if(a == uf[i].r and (s[i] == 2)){ s[i] = ts; } } } // -1 - undefined brak // 0 - brak // 1 - ma // 2 - ? int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, q; cin>>n>>q; vector<int> s(n, -1); vector<piii> uf(n, {{0, 1}, 0}); for(int i = 0; i < n; i++){uf[i].r=i;} char m; int a, b; for(int i = 0; i < q; i++){ cin>>m; if(m == '?'){ cin>>a; a--; if(s[a]<=0){cout<<0;} else if(s[a]==1){cout<<1;} else {cout<<"?";} } else if(m == '+'){ cin>>a>>b; a--; b--; s[a] = 2; s[b] = 2; _f(a, uf); _f(b, uf); if(uf[a].r != uf[b].r){ _u(a, b, uf); } else{ uf[uf[a].r].lk++; } if(uf[uf[a].r].ll == uf[uf[a].r].lk){ _s(uf[a].r, s, uf, 1); } } else{ cin>>a; a--; _f(a, uf); s[a] = 0; uf[uf[a].r].lk--; if(uf[uf[a].r].lk == 0){ _s(uf[a].r, s, uf, 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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #include<bits/stdc++.h> using namespace std; typedef pair<pair<int, int>, int> piii; #define r first.first #define ll first.second #define lk second int _f(int a, vector<piii> &uf){ while(uf[a].r != uf[uf[a].r].r){ a = uf[a].r; } return(a); } void _u(int a, int b, vector<piii> &uf){ a = _f(a, uf); b = _f(b, uf); uf[b].r = uf[a].r; uf[a].ll += uf[b].ll; uf[a].lk += uf[b].lk + 1; } void _s(int a, vector<int> &s, vector<piii> &uf, int ts){ for(int i = 0; i < s.size(); i++){ _f(i, uf); if(a == uf[i].r and (s[i] == 2)){ s[i] = ts; } } } // -1 - undefined brak // 0 - brak // 1 - ma // 2 - ? int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, q; cin>>n>>q; vector<int> s(n, -1); vector<piii> uf(n, {{0, 1}, 0}); for(int i = 0; i < n; i++){uf[i].r=i;} char m; int a, b; for(int i = 0; i < q; i++){ cin>>m; if(m == '?'){ cin>>a; a--; if(s[a]<=0){cout<<0;} else if(s[a]==1){cout<<1;} else {cout<<"?";} } else if(m == '+'){ cin>>a>>b; a--; b--; s[a] = 2; s[b] = 2; _f(a, uf); _f(b, uf); if(uf[a].r != uf[b].r){ _u(a, b, uf); } else{ uf[uf[a].r].lk++; } if(uf[uf[a].r].ll == uf[uf[a].r].lk){ _s(uf[a].r, s, uf, 1); } } else{ cin>>a; a--; _f(a, uf); s[a] = 0; uf[uf[a].r].lk--; if(uf[uf[a].r].lk == 0){ _s(uf[a].r, s, uf, 0); } } } cout<<"\n"; } |