#include <bits/stdc++.h>
using namespace std;
constexpr int MAX_N = 1.5e6 + 7;
int nxt[MAX_N], siz[MAX_N];
bool has[MAX_N];
int find(int u) {
if (nxt[u] == u) {
return u;
}
nxt[u] = find(nxt[u]);
return nxt[u];
}
void unite(int u, int v) {
u = find(u);
v = find(v);
if (u == v) {
has[u] = true;
}
else {
if (siz[u] > siz[v]) {
swap(u, v);
}
siz[v] += siz[u];
if (has[u]) {
has[v] = true;
}
nxt[u] = v;
}
}
int who[MAX_N], last_who;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
iota(nxt, nxt + n + q + 5, 0);
fill(siz, siz + n + q + 5, 1);
iota(who, who + n + q + 5, 0);
last_who = n + 1;
string result = "";
while (q--) {
char type;
cin >> type;
if (type == '+') {
int u, v;
cin >> u >> v;
unite(who[u], who[v]);
}
else if (type == '-') {
int u;
cin >> u;
auto tmp = find(who[u]);
siz[tmp]--;
who[u] = last_who++;
}
else { // type == '?'
int u;
cin >> u;
auto tmp = find(who[u]);
if (has[tmp]) {
result += '1';
}
else if (siz[tmp] == 1) {
result += '0';
}
else {
result += '?';
}
}
}
cout << result << "\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 80 81 82 | #include <bits/stdc++.h> using namespace std; constexpr int MAX_N = 1.5e6 + 7; int nxt[MAX_N], siz[MAX_N]; bool has[MAX_N]; int find(int u) { if (nxt[u] == u) { return u; } nxt[u] = find(nxt[u]); return nxt[u]; } void unite(int u, int v) { u = find(u); v = find(v); if (u == v) { has[u] = true; } else { if (siz[u] > siz[v]) { swap(u, v); } siz[v] += siz[u]; if (has[u]) { has[v] = true; } nxt[u] = v; } } int who[MAX_N], last_who; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; iota(nxt, nxt + n + q + 5, 0); fill(siz, siz + n + q + 5, 1); iota(who, who + n + q + 5, 0); last_who = n + 1; string result = ""; while (q--) { char type; cin >> type; if (type == '+') { int u, v; cin >> u >> v; unite(who[u], who[v]); } else if (type == '-') { int u; cin >> u; auto tmp = find(who[u]); siz[tmp]--; who[u] = last_who++; } else { // type == '?' int u; cin >> u; auto tmp = find(who[u]); if (has[tmp]) { result += '1'; } else if (siz[tmp] == 1) { result += '0'; } else { result += '?'; } } } cout << result << "\n"; return 0; } |
English