#include <cstdio>
#include <vector>
#include <set>
using namespace std;
int main () {
int n, q;
scanf("%d %d\n", &n, &q);
vector<pair<bool, set<int> > > parts;
vector<int> nodes(n + 8, -1);
for (int i = 0; i < q; ++i) {
if (i) {
scanf("\n");
}
char type;
scanf("%c", &type);
if (type == '?') {
int d;
scanf("%d", &d);
if (nodes[d] == -1) {
printf("0");
}
else if (parts[nodes[d]].first) {
printf("1");
}
else {
printf("?");
}
}
else if (type == '+') {
int a, b;
scanf("%d %d", &a, &b);
if ((nodes[a] == -1) && (nodes[b] == -1)) {
pair<bool, set<int> > part = make_pair(true, set<int>());
part.second.insert(a);
nodes[a] = parts.size();
if (a != b) {
part.second.insert(b);
part.first = false;
nodes[b] = parts.size();
}
parts.push_back(part);
}
else {
int merge_from = a;
int merge_into = b;
if ((nodes[b] == -1) || ((nodes[a] != -1) && (parts[nodes[a]].second.size() > parts[nodes[b]].second.size()))) {
merge_from = b;
merge_into = a;
}
if (nodes[merge_from] != -1) {
if (nodes[merge_from] == nodes[merge_into]) {
parts[nodes[merge_from]].first = true;
}
else {
if (parts[nodes[merge_from]].first) {
parts[nodes[merge_into]].first = true;
}
int nmf = nodes[merge_from];
int nmi = nodes[merge_into];
for (set<int>::iterator it = parts[nmf].second.begin(); it != parts[nmf].second.end(); it++) {
nodes[*it] = nmi;
parts[nmi].second.insert(*it);
}
}
}
else {
nodes[merge_from] = nodes[merge_into];
parts[nodes[merge_into]].second.insert(merge_from);
}
}
}
else { // type == '-'
int c;
scanf("%d", &c);
parts[nodes[c]].second.erase(c);
if ((parts[nodes[c]].second.size() == 1) && !parts[nodes[c]].first) {
nodes[*parts[nodes[c]].second.begin()] = -1;
}
nodes[c] = -1;
}
}
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 82 83 84 85 86 | #include <cstdio> #include <vector> #include <set> using namespace std; int main () { int n, q; scanf("%d %d\n", &n, &q); vector<pair<bool, set<int> > > parts; vector<int> nodes(n + 8, -1); for (int i = 0; i < q; ++i) { if (i) { scanf("\n"); } char type; scanf("%c", &type); if (type == '?') { int d; scanf("%d", &d); if (nodes[d] == -1) { printf("0"); } else if (parts[nodes[d]].first) { printf("1"); } else { printf("?"); } } else if (type == '+') { int a, b; scanf("%d %d", &a, &b); if ((nodes[a] == -1) && (nodes[b] == -1)) { pair<bool, set<int> > part = make_pair(true, set<int>()); part.second.insert(a); nodes[a] = parts.size(); if (a != b) { part.second.insert(b); part.first = false; nodes[b] = parts.size(); } parts.push_back(part); } else { int merge_from = a; int merge_into = b; if ((nodes[b] == -1) || ((nodes[a] != -1) && (parts[nodes[a]].second.size() > parts[nodes[b]].second.size()))) { merge_from = b; merge_into = a; } if (nodes[merge_from] != -1) { if (nodes[merge_from] == nodes[merge_into]) { parts[nodes[merge_from]].first = true; } else { if (parts[nodes[merge_from]].first) { parts[nodes[merge_into]].first = true; } int nmf = nodes[merge_from]; int nmi = nodes[merge_into]; for (set<int>::iterator it = parts[nmf].second.begin(); it != parts[nmf].second.end(); it++) { nodes[*it] = nmi; parts[nmi].second.insert(*it); } } } else { nodes[merge_from] = nodes[merge_into]; parts[nodes[merge_into]].second.insert(merge_from); } } } else { // type == '-' int c; scanf("%d", &c); parts[nodes[c]].second.erase(c); if ((parts[nodes[c]].second.size() == 1) && !parts[nodes[c]].first) { nodes[*parts[nodes[c]].second.begin()] = -1; } nodes[c] = -1; } } printf("\n"); return 0; } |
English