#include <algorithm> #include <iostream> #include <optional> #include <vector> using namespace std; int find(int u, vector<int> &us) { if (us[u] == u) return u; return us[u] = find(us[u], us); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; cin >> n >> q; vector<int> us(n); vector<int> mtou(n); // the only fixed size vector<int> totalUSize(n); vector<int> realUSize(n); vector<bool> isUSatisfied(n); for (int i = 0; i < n; i++) { us[i] = i; mtou[i] = i; totalUSize[i] = 1; realUSize[i] = 1; isUSatisfied[i] = false; } for (int i = 0; i < q; i++) { char c; cin >> c; int a, b, u, u2; switch (c) { case '+': cin >> a >> b; a--; b--; u = find(mtou[a], us); u2 = find(mtou[b], us); if (u == u2) { isUSatisfied[u] = true; break; } if (totalUSize[u] < totalUSize[u2]) { swap(u, u2); } us[u2] = u; totalUSize[u] += totalUSize[u2]; realUSize[u] += realUSize[u2]; isUSatisfied[u] = isUSatisfied[u] || isUSatisfied[u2]; break; case '-': cin >> a; a--; u = find(mtou[a], us); realUSize[u]--; totalUSize.push_back(1); realUSize.push_back(1); isUSatisfied.push_back(false); mtou[a] = us.size(); us.push_back(us.size()); break; case '?': cin >> a; a--; u = find(mtou[a], us); if (isUSatisfied[u]) { cout << 1; } else if (realUSize[u] == 1) { cout << 0; } else { cout << "?"; } break; } } }
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 | #include <algorithm> #include <iostream> #include <optional> #include <vector> using namespace std; int find(int u, vector<int> &us) { if (us[u] == u) return u; return us[u] = find(us[u], us); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; cin >> n >> q; vector<int> us(n); vector<int> mtou(n); // the only fixed size vector<int> totalUSize(n); vector<int> realUSize(n); vector<bool> isUSatisfied(n); for (int i = 0; i < n; i++) { us[i] = i; mtou[i] = i; totalUSize[i] = 1; realUSize[i] = 1; isUSatisfied[i] = false; } for (int i = 0; i < q; i++) { char c; cin >> c; int a, b, u, u2; switch (c) { case '+': cin >> a >> b; a--; b--; u = find(mtou[a], us); u2 = find(mtou[b], us); if (u == u2) { isUSatisfied[u] = true; break; } if (totalUSize[u] < totalUSize[u2]) { swap(u, u2); } us[u2] = u; totalUSize[u] += totalUSize[u2]; realUSize[u] += realUSize[u2]; isUSatisfied[u] = isUSatisfied[u] || isUSatisfied[u2]; break; case '-': cin >> a; a--; u = find(mtou[a], us); realUSize[u]--; totalUSize.push_back(1); realUSize.push_back(1); isUSatisfied.push_back(false); mtou[a] = us.size(); us.push_back(us.size()); break; case '?': cin >> a; a--; u = find(mtou[a], us); if (isUSatisfied[u]) { cout << 1; } else if (realUSize[u] == 1) { cout << 0; } else { cout << "?"; } break; } } } |