#include <iostream> #include <vector> #include <set> using namespace std; vector <pair<set<int>, bool> > V; int n=0, q=0; int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); cin>>n>>q; char c; int x=0, y=0; for(int i=0;i<q;i++){ cin>>c; int indx=-1, indy=-1; if(c=='+'){ cin>>x>>y; for(int j=0;j<V.size();j++){ auto searchx = V[j].first.find(x); auto searchy = V[j].first.find(y); if(searchx != V[j].first.end()){ indx = j; } if(searchy != V[j].first.end()){ indy = j; } } if(indx == -1 && indy == -1){ // żaden nie wystąpił w wektorze setów set<int> ass; ass.insert(x); ass.insert(y); if(x==y){ V.push_back({ass, true}); } else{ V.push_back({ass, false}); } } else if(indx != -1 && indy != -1){ // oba wystąpiły w vektorze setów if(indx == indy){ V[indx].second = true; } else{ if(V[indy].first.size() <= V[indx].first.size()){ for (auto it = V[indy].first.begin(); it != V[indy].first.end(); ++it) { V[indx].first.insert(*it); } if(V[indy].second){ V[indx].second = true; } V.erase(V.begin() + indy); } else{ for (auto it = V[indx].first.begin(); it != V[indx].first.end(); ++it) { V[indy].first.insert(*it); } if(V[indx].second){ V[indy].second = true; } V.erase(V.begin() + indx); } } } else{ // tylko jeden z nich wystąpił w wektorze setów if(indx != -1){ V[indx].first.insert(y); } else{ V[indy].first.insert(x); } } } else if(c =='-'){ cin>>x; for(int j=0;j<V.size();j++){ auto searchx = V[j].first.find(x); if(searchx != V[j].first.end()){ V[j].first.erase(x); if(V[j].first.size() == 1 && V[j].second == false){ V.erase(V.begin()+j); } break; } } } else if(c == '?'){ cin>>x; bool flag = false; for(int j=0;j<V.size();j++){ auto searchx = V[j].first.find(x); if(searchx != V[j].first.end()){ if(V[j].second == true){ cout<<1; flag = true; break; } else{ cout<<"?"; flag = true; break; } } } if(!flag){ cout<<0; } } } cout<<"\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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include <iostream> #include <vector> #include <set> using namespace std; vector <pair<set<int>, bool> > V; int n=0, q=0; int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); cin>>n>>q; char c; int x=0, y=0; for(int i=0;i<q;i++){ cin>>c; int indx=-1, indy=-1; if(c=='+'){ cin>>x>>y; for(int j=0;j<V.size();j++){ auto searchx = V[j].first.find(x); auto searchy = V[j].first.find(y); if(searchx != V[j].first.end()){ indx = j; } if(searchy != V[j].first.end()){ indy = j; } } if(indx == -1 && indy == -1){ // żaden nie wystąpił w wektorze setów set<int> ass; ass.insert(x); ass.insert(y); if(x==y){ V.push_back({ass, true}); } else{ V.push_back({ass, false}); } } else if(indx != -1 && indy != -1){ // oba wystąpiły w vektorze setów if(indx == indy){ V[indx].second = true; } else{ if(V[indy].first.size() <= V[indx].first.size()){ for (auto it = V[indy].first.begin(); it != V[indy].first.end(); ++it) { V[indx].first.insert(*it); } if(V[indy].second){ V[indx].second = true; } V.erase(V.begin() + indy); } else{ for (auto it = V[indx].first.begin(); it != V[indx].first.end(); ++it) { V[indy].first.insert(*it); } if(V[indx].second){ V[indy].second = true; } V.erase(V.begin() + indx); } } } else{ // tylko jeden z nich wystąpił w wektorze setów if(indx != -1){ V[indx].first.insert(y); } else{ V[indy].first.insert(x); } } } else if(c =='-'){ cin>>x; for(int j=0;j<V.size();j++){ auto searchx = V[j].first.find(x); if(searchx != V[j].first.end()){ V[j].first.erase(x); if(V[j].first.size() == 1 && V[j].second == false){ V.erase(V.begin()+j); } break; } } } else if(c == '?'){ cin>>x; bool flag = false; for(int j=0;j<V.size();j++){ auto searchx = V[j].first.find(x); if(searchx != V[j].first.end()){ if(V[j].second == true){ cout<<1; flag = true; break; } else{ cout<<"?"; flag = true; break; } } } if(!flag){ cout<<0; } } } cout<<"\n"; return 0; } |