// #include <bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_set>
using namespace std;
struct tree {
unordered_set<int> elems;
int power;
};
vector<tree*> trees;
void mark(int arg0,int arg1) {
tree* ti = trees[arg0];
tree* tj = trees[arg1];
if (ti != NULL && tj != NULL) {
if (ti == tj) {
ti->power++;
} else {
if (tj->elems.size()>ti->elems.size()) {
tj, ti = ti, tj;
}
ti->power = ti->power + tj->power +1;
for (auto v : tj->elems) {
trees[v] = ti;
ti->elems.insert(v) ;
}
}
} else if(ti != NULL){
ti->elems.insert(arg1);
ti->power++;
trees[arg1] = trees[arg0];
} else if(tj != NULL){
tj->elems.insert(arg0);
tj->power++;
trees[arg0] = trees[arg1];
}else {
ti = new(tree);
ti->elems.insert(arg0);
ti->elems.insert(arg1);
ti->power=1;
trees[arg0] = ti;
trees[arg1] = ti;
}
// cout <<endl <<"ALTER DEBUG: " <<i << ":"<< j<< endl << flush;
// tree_dbg();
}
int main()
{
FAST
int n, q;
cin >> n >> q;
trees = vector<tree*>(n+1);
char op;
int arg0, arg1;
tree *ti;
tree *tj;
int tp;
for (int i = 0; i < q; i++)
{
cin >> op;
switch (op)
{
case '+':
cin >> arg0 >> arg1;
mark(arg0,arg1);
break;
case '-':
cin >> arg0;
ti = trees[arg0];
ti->elems.erase(arg0);
ti->power--;
trees[arg0] = NULL;
break;
case '?':
cin >> arg0;
ti = trees[arg0];
if (ti == NULL || ti->power == 0) {
cout << 0;
} else if (ti->elems.size() == ti->power) {
cout << 1;
} else {
cout << "?";
}
break;
default:
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 90 91 92 93 94 95 96 97 98 99 | // #include <bits/stdc++.h> #define FAST ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); #include <iostream> #include <vector> #include <queue> #include <unordered_set> using namespace std; struct tree { unordered_set<int> elems; int power; }; vector<tree*> trees; void mark(int arg0,int arg1) { tree* ti = trees[arg0]; tree* tj = trees[arg1]; if (ti != NULL && tj != NULL) { if (ti == tj) { ti->power++; } else { if (tj->elems.size()>ti->elems.size()) { tj, ti = ti, tj; } ti->power = ti->power + tj->power +1; for (auto v : tj->elems) { trees[v] = ti; ti->elems.insert(v) ; } } } else if(ti != NULL){ ti->elems.insert(arg1); ti->power++; trees[arg1] = trees[arg0]; } else if(tj != NULL){ tj->elems.insert(arg0); tj->power++; trees[arg0] = trees[arg1]; }else { ti = new(tree); ti->elems.insert(arg0); ti->elems.insert(arg1); ti->power=1; trees[arg0] = ti; trees[arg1] = ti; } // cout <<endl <<"ALTER DEBUG: " <<i << ":"<< j<< endl << flush; // tree_dbg(); } int main() { FAST int n, q; cin >> n >> q; trees = vector<tree*>(n+1); char op; int arg0, arg1; tree *ti; tree *tj; int tp; for (int i = 0; i < q; i++) { cin >> op; switch (op) { case '+': cin >> arg0 >> arg1; mark(arg0,arg1); break; case '-': cin >> arg0; ti = trees[arg0]; ti->elems.erase(arg0); ti->power--; trees[arg0] = NULL; break; case '?': cin >> arg0; ti = trees[arg0]; if (ti == NULL || ti->power == 0) { cout << 0; } else if (ti->elems.size() == ti->power) { cout << 1; } else { cout << "?"; } break; default: break; } } } |
English