#include <iostream> #include <vector> #include <unordered_set> using namespace std; const int MAXQ = 1000001; const int MAXN = 300001; vector<unordered_set<int>>Grupa(MAXQ); vector<int>Belong(MAXN); vector<char>HC(MAXN, '0'); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, q, it = 0; cin >> n >> q; for (int i = 1; i <= n; i++) { Grupa[i].insert(i); Belong[i] = ++it; } string res = ""; while (q--) { char z; cin >> z; if (z == '?') { int a; cin >> a; res += HC[a]; } else if (z == '+') { int a, b; cin >> a >> b; if (Belong[a] == Belong[b]) { for (auto x : Grupa[Belong[a]]) HC[x] = '1'; Grupa[Belong[a]].clear(); } else if (HC[a] == '1') { for (auto x : Grupa[Belong[b]]) HC[x] = '1'; Grupa[Belong[b]].clear(); } else if (HC[b] == '1') { for (auto x : Grupa[Belong[a]]) HC[x] = '1'; Grupa[Belong[a]].clear(); } else { HC[a] = '?'; HC[b] = '?'; if (Grupa[Belong[a]].size() < Grupa[Belong[b]].size()) swap(a, b); int numer = Belong[b]; for (auto& x : Grupa[numer]) { Belong[x] = Belong[a]; Grupa[Belong[a]].insert(x); } Grupa[numer].clear(); } } else { int a; cin >> a; Grupa[Belong[a]].erase(a); if (Grupa[Belong[a]].size() == 1) { HC[*Grupa[Belong[a]].begin()] = '0'; } Belong[a] = ++it; Grupa[Belong[a]].insert(a); HC[a] = '0'; } } cout << res << '\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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <iostream> #include <vector> #include <unordered_set> using namespace std; const int MAXQ = 1000001; const int MAXN = 300001; vector<unordered_set<int>>Grupa(MAXQ); vector<int>Belong(MAXN); vector<char>HC(MAXN, '0'); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, q, it = 0; cin >> n >> q; for (int i = 1; i <= n; i++) { Grupa[i].insert(i); Belong[i] = ++it; } string res = ""; while (q--) { char z; cin >> z; if (z == '?') { int a; cin >> a; res += HC[a]; } else if (z == '+') { int a, b; cin >> a >> b; if (Belong[a] == Belong[b]) { for (auto x : Grupa[Belong[a]]) HC[x] = '1'; Grupa[Belong[a]].clear(); } else if (HC[a] == '1') { for (auto x : Grupa[Belong[b]]) HC[x] = '1'; Grupa[Belong[b]].clear(); } else if (HC[b] == '1') { for (auto x : Grupa[Belong[a]]) HC[x] = '1'; Grupa[Belong[a]].clear(); } else { HC[a] = '?'; HC[b] = '?'; if (Grupa[Belong[a]].size() < Grupa[Belong[b]].size()) swap(a, b); int numer = Belong[b]; for (auto& x : Grupa[numer]) { Belong[x] = Belong[a]; Grupa[Belong[a]].insert(x); } Grupa[numer].clear(); } } else { int a; cin >> a; Grupa[Belong[a]].erase(a); if (Grupa[Belong[a]].size() == 1) { HC[*Grupa[Belong[a]].begin()] = '0'; } Belong[a] = ++it; Grupa[Belong[a]].insert(a); HC[a] = '0'; } } cout << res << '\n'; return 0; } |