#include<iostream> #include<vector> using namespace std; int find(int w, vector<int> &R) { if(w != R[w]) { R[w] = find(R[w], R); return R[w]; } return w; } void un(int w, int w2, vector<int> &R, vector<int> &G, vector<int> &W, vector<int>&S) { int x1 = find(w, R); int x2 = find(w2, R); if(x1 != x2) { if(G[x1] >= G[x2]) { R[x2] = x1; G[x1] = max(G[x1], G[x2] + 1); W[x1] += W[x2]; if(S[x2] == 1) { S[x1] = 1; } if(S[x1] == 0) { S[x1] = 2; } } else { R[x1] = x2; G[x2] = max(G[x2], G[x1] + 1); W[x2] += W[x1]; if(S[x1] == 1) { S[x2] = 1; } if(S[x2] == 0) { S[x2] = 2; } } } else { S[x1] = 1; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; int q; cin >> n; cin >> q; char a; int x; int x2; vector<int> G(2 * n + 1, 1); // glebokosc vector<int> W(2 * n + 1, 1); // wielkosc vector<int> S(2 * n + 1, 0); // 0 - nie ma, 1 - ma, 2 - ? vector<int> R(2 * n + 1, 0); // rodzic int licznik_wierzcholkow = 2 * n + 1; for(int i = 0; i <= n; i++) { R[i] = i + n; } for(int i = n + 1; i <= 2 * n; i++) { R[i] = i; } int korzen; for(int p = 0; p < q; p++) { cin >> a; cin >> x; korzen = find(x, R); if(a == '+') { cin >> x2; un(x, x2, R, G, W, S); } if(a == '?') { int stan = S[korzen]; if(stan == 0) { cout<<"0"; } if(stan == 1) { cout<<"1"; } if(stan == 2) { cout<<"?"; } } if(a == '-') { R[x] = licznik_wierzcholkow; R.push_back(licznik_wierzcholkow); S.push_back(0); G.push_back(1); W.push_back(1); licznik_wierzcholkow++; W[korzen]--; // cout<<endl<<W[korzen]<<" "<<S[korzen]<<endl; if(W[korzen] == 1 && S[korzen] == 2) { S[korzen] = 0; } } } 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 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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include<iostream> #include<vector> using namespace std; int find(int w, vector<int> &R) { if(w != R[w]) { R[w] = find(R[w], R); return R[w]; } return w; } void un(int w, int w2, vector<int> &R, vector<int> &G, vector<int> &W, vector<int>&S) { int x1 = find(w, R); int x2 = find(w2, R); if(x1 != x2) { if(G[x1] >= G[x2]) { R[x2] = x1; G[x1] = max(G[x1], G[x2] + 1); W[x1] += W[x2]; if(S[x2] == 1) { S[x1] = 1; } if(S[x1] == 0) { S[x1] = 2; } } else { R[x1] = x2; G[x2] = max(G[x2], G[x1] + 1); W[x2] += W[x1]; if(S[x1] == 1) { S[x2] = 1; } if(S[x2] == 0) { S[x2] = 2; } } } else { S[x1] = 1; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; int q; cin >> n; cin >> q; char a; int x; int x2; vector<int> G(2 * n + 1, 1); // glebokosc vector<int> W(2 * n + 1, 1); // wielkosc vector<int> S(2 * n + 1, 0); // 0 - nie ma, 1 - ma, 2 - ? vector<int> R(2 * n + 1, 0); // rodzic int licznik_wierzcholkow = 2 * n + 1; for(int i = 0; i <= n; i++) { R[i] = i + n; } for(int i = n + 1; i <= 2 * n; i++) { R[i] = i; } int korzen; for(int p = 0; p < q; p++) { cin >> a; cin >> x; korzen = find(x, R); if(a == '+') { cin >> x2; un(x, x2, R, G, W, S); } if(a == '?') { int stan = S[korzen]; if(stan == 0) { cout<<"0"; } if(stan == 1) { cout<<"1"; } if(stan == 2) { cout<<"?"; } } if(a == '-') { R[x] = licznik_wierzcholkow; R.push_back(licznik_wierzcholkow); S.push_back(0); G.push_back(1); W.push_back(1); licznik_wierzcholkow++; W[korzen]--; // cout<<endl<<W[korzen]<<" "<<S[korzen]<<endl; if(W[korzen] == 1 && S[korzen] == 2) { S[korzen] = 0; } } } return 0; } |