#include <bits/stdc++.h>
using namespace std;
typedef vector<int> VI;
typedef pair <int,int> ii;
typedef long long LL;
#define pb push_back
const int INF = 2147483647;
const int N = 300005;
int parent[N], type[N], n, q, i, a, b, c, d, newL;
char t[3];
set<int> v[N];
VI vv;
void makeSet(int a) {
parent[a] = a;
v[a].insert(a);
type[a] = 0;
}
void Union(int a, int b) {
int newType = max(type[a], type[b]);
if (v[a].size() >= v[b].size()) {
for (auto& w : v[b]) {
v[a].insert(w);
parent[w] = a;
}
v[b].clear();
type[a] = newType;
} else {
for (auto& w : v[a]) {
v[b].insert(w);
parent[w] = b;
}
v[a].clear();
type[b] = newType;
}
}
int main() {
srand(time(0));
scanf("%d %d", &n, &q);
for (i=1;i<=n;i++) makeSet(i);
while (q--) {
scanf("%s", t);
if (t[0] == '+') {
scanf("%d %d", &a, &b);
c = parent[a];
d = parent[b];
if (c == d) type[c] = 1; else Union(c, d);
} else if (t[0] == '-') {
scanf("%d", &a);
c = parent[a];
if (c != a) {
makeSet(a);
v[c].erase(a);
} else if (v[c].size() == 1) {
type[a] = 0;
} else {
vv.clear();
for (auto& w : v[c]) if (w != a) vv.pb(w);
v[c].clear();
newL = vv[rand() % vv.size()];
type[newL] = type[c];
makeSet(a);
for (auto& w : vv) {
parent[w] = newL;
v[newL].insert(w);
}
}
} else {
scanf("%d", &a);
c = parent[a];
//printf("%d %d %d %d\n", a, c, v[c].size(), type[c]);
if (v[c].size() == 1 && type[c] == 0) printf("0"); else if (type[c] == 1) printf("1"); else printf("?");
}
}
printf("\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 | #include <bits/stdc++.h> using namespace std; typedef vector<int> VI; typedef pair <int,int> ii; typedef long long LL; #define pb push_back const int INF = 2147483647; const int N = 300005; int parent[N], type[N], n, q, i, a, b, c, d, newL; char t[3]; set<int> v[N]; VI vv; void makeSet(int a) { parent[a] = a; v[a].insert(a); type[a] = 0; } void Union(int a, int b) { int newType = max(type[a], type[b]); if (v[a].size() >= v[b].size()) { for (auto& w : v[b]) { v[a].insert(w); parent[w] = a; } v[b].clear(); type[a] = newType; } else { for (auto& w : v[a]) { v[b].insert(w); parent[w] = b; } v[a].clear(); type[b] = newType; } } int main() { srand(time(0)); scanf("%d %d", &n, &q); for (i=1;i<=n;i++) makeSet(i); while (q--) { scanf("%s", t); if (t[0] == '+') { scanf("%d %d", &a, &b); c = parent[a]; d = parent[b]; if (c == d) type[c] = 1; else Union(c, d); } else if (t[0] == '-') { scanf("%d", &a); c = parent[a]; if (c != a) { makeSet(a); v[c].erase(a); } else if (v[c].size() == 1) { type[a] = 0; } else { vv.clear(); for (auto& w : v[c]) if (w != a) vv.pb(w); v[c].clear(); newL = vv[rand() % vv.size()]; type[newL] = type[c]; makeSet(a); for (auto& w : vv) { parent[w] = newL; v[newL].insert(w); } } } else { scanf("%d", &a); c = parent[a]; //printf("%d %d %d %d\n", a, c, v[c].size(), type[c]); if (v[c].size() == 1 && type[c] == 0) printf("0"); else if (type[c] == 1) printf("1"); else printf("?"); } } printf("\n"); return 0; } |
English