#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
int n,q,a,b;
//std::vector<std::set<int>>sa;
std::vector<char>st;
std::vector<int>element_to_set;
std::vector<std::set<int>>sets_elements;
int main() {
std::ios_base::sync_with_stdio(0);
std::cin.tie(NULL);
std::cin>>n>>q;
st.resize(n+1,'0');
//sa.resize(n+1);
char op;
sets_elements.resize(n+q+1);
for(int i=0;i<=n;i++){
element_to_set.emplace_back(i);
sets_elements[i].insert(i);
}
int last_set=n;
for(int i=0;i<q;i++){
std::cin>>op>>a;
if(op == '+')
std::cin>>b;
if(op=='-'){
if(st[a]=='?'){
sets_elements[element_to_set[a]].erase(a);
int set=element_to_set[a];
last_set++;
element_to_set[a]=last_set;
sets_elements[last_set].insert(a);
if(sets_elements[set].size()==1)
st[*sets_elements[set].begin()]='0';
}
st[a]='0';
}
//std::cerr<<op<<a<<b<<std::endl;
if(op=='?')
std::cout<<st[a];
if(op=='+'){
if(st[a]=='1')
std::swap(a,b);
if(st[b]=='1'||element_to_set[a]==element_to_set[b]){
int set=element_to_set[a];
//std::cerr<<"before loop"<<set<<std::endl;
for(auto x:sets_elements[set]){
//std::cerr<<set<<"xxx: "<<x<<" "<<sets_elements.size()<<std::endl;
st[x]='1';
last_set++;
element_to_set[x]=last_set;
sets_elements[last_set].insert(x);
}
sets_elements[set].clear();
}
else{
if(sets_elements[element_to_set[a]].size()>sets_elements[element_to_set[b]].size())
std::swap(a,b);
int set=element_to_set[a];
for(auto x:sets_elements[set]){
sets_elements[element_to_set[b]].insert(x);
element_to_set[x]=element_to_set[b];
//std::cerr<<"redirect"<<x<<" "<<b<<std::endl;
//for(auto y:sets_elements[element_to_set[b]])
//std::cerr<<y<<std::endl;
}
sets_elements[set].clear();
st[a]='?';
st[b]='?';
}
}
//std::cerr<<"st "<<st[1]<<" "<<st[2]<<" "<<st[3]<<std::endl;
}
std::cout<<"\n";
}
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 <iostream> #include <vector> #include <set> #include <algorithm> int n,q,a,b; //std::vector<std::set<int>>sa; std::vector<char>st; std::vector<int>element_to_set; std::vector<std::set<int>>sets_elements; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(NULL); std::cin>>n>>q; st.resize(n+1,'0'); //sa.resize(n+1); char op; sets_elements.resize(n+q+1); for(int i=0;i<=n;i++){ element_to_set.emplace_back(i); sets_elements[i].insert(i); } int last_set=n; for(int i=0;i<q;i++){ std::cin>>op>>a; if(op == '+') std::cin>>b; if(op=='-'){ if(st[a]=='?'){ sets_elements[element_to_set[a]].erase(a); int set=element_to_set[a]; last_set++; element_to_set[a]=last_set; sets_elements[last_set].insert(a); if(sets_elements[set].size()==1) st[*sets_elements[set].begin()]='0'; } st[a]='0'; } //std::cerr<<op<<a<<b<<std::endl; if(op=='?') std::cout<<st[a]; if(op=='+'){ if(st[a]=='1') std::swap(a,b); if(st[b]=='1'||element_to_set[a]==element_to_set[b]){ int set=element_to_set[a]; //std::cerr<<"before loop"<<set<<std::endl; for(auto x:sets_elements[set]){ //std::cerr<<set<<"xxx: "<<x<<" "<<sets_elements.size()<<std::endl; st[x]='1'; last_set++; element_to_set[x]=last_set; sets_elements[last_set].insert(x); } sets_elements[set].clear(); } else{ if(sets_elements[element_to_set[a]].size()>sets_elements[element_to_set[b]].size()) std::swap(a,b); int set=element_to_set[a]; for(auto x:sets_elements[set]){ sets_elements[element_to_set[b]].insert(x); element_to_set[x]=element_to_set[b]; //std::cerr<<"redirect"<<x<<" "<<b<<std::endl; //for(auto y:sets_elements[element_to_set[b]]) //std::cerr<<y<<std::endl; } sets_elements[set].clear(); st[a]='?'; st[b]='?'; } } //std::cerr<<"st "<<st[1]<<" "<<st[2]<<" "<<st[3]<<std::endl; } std::cout<<"\n"; } |
English