//Jakub Trela #include <bits/stdc++.h> using namespace std; typedef long long LL; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,q; cin>>n>>q; vector<set<int>> zbiory(n+1); vector<int> kolor(n+1); vector<int> ktory(n+1); for(int i=1;i<=n;i++){ zbiory[i].insert(i); ktory[i]=i; } for(int i=0;i<q;i++){ char c; int a,b; cin>>c; if(c=='+'){ cin>>a>>b; if(zbiory[ktory[b]].size()>zbiory[ktory[a]].size())swap(a,b); int ka=kolor[ktory[a]]; int kb=kolor[ktory[b]]; if(a==b){ kolor[ktory[a]]=1; }else if(ka==0 && kb==0){ int stary=ktory[b]; for(int x:zbiory[ktory[b]]){ zbiory[ktory[a]].insert(x); ktory[x]=ktory[a]; } zbiory[stary].clear(); kolor[ktory[a]]=-1; }else if(ka==0 && kb==-1){ int stary=ktory[b]; for(int x:zbiory[ktory[b]]){ zbiory[ktory[a]].insert(x); ktory[x]=ktory[a]; } zbiory[stary].clear(); kolor[ktory[a]]=-1; }else if(ka==0 && kb==1){ kolor[ktory[a]]=1; }else if(ka==-1 && kb==0){ int stary=ktory[b]; for(int x:zbiory[ktory[b]]){ zbiory[ktory[a]].insert(x); ktory[x]=ktory[a]; } zbiory[stary].clear(); kolor[ktory[a]]=-1; }else if(ka==-1 && kb==-1){ if(ktory[a]==ktory[b]){ kolor[ktory[a]]=1; }else{ int stary=ktory[b]; for(int x:zbiory[ktory[b]]){ zbiory[ktory[a]].insert(x); ktory[x]=ktory[a]; } zbiory[stary].clear(); } }else if(ka==-1 && kb==1){ kolor[ktory[a]]=1; }else if(ka==1 && kb==0){ kolor[ktory[b]]=1; }else if(ka==1 && kb==-1){ kolor[ktory[b]]=1; } }else if(c=='-'){ cin>>a; zbiory[ktory[a]].erase(a); if(zbiory[ktory[a]].size()==1 && kolor[ktory[a]]==-1)kolor[ktory[a]]=0; zbiory.push_back({a}); kolor.push_back(0); ktory[a]=zbiory.size()-1; kolor[ktory[a]]=0; }else if(c=='?'){ cin>>a; int stan=kolor[ktory[a]]; if(stan==-1)cout<<'?'; else cout<<stan; } } cout<<endl; 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 | //Jakub Trela #include <bits/stdc++.h> using namespace std; typedef long long LL; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,q; cin>>n>>q; vector<set<int>> zbiory(n+1); vector<int> kolor(n+1); vector<int> ktory(n+1); for(int i=1;i<=n;i++){ zbiory[i].insert(i); ktory[i]=i; } for(int i=0;i<q;i++){ char c; int a,b; cin>>c; if(c=='+'){ cin>>a>>b; if(zbiory[ktory[b]].size()>zbiory[ktory[a]].size())swap(a,b); int ka=kolor[ktory[a]]; int kb=kolor[ktory[b]]; if(a==b){ kolor[ktory[a]]=1; }else if(ka==0 && kb==0){ int stary=ktory[b]; for(int x:zbiory[ktory[b]]){ zbiory[ktory[a]].insert(x); ktory[x]=ktory[a]; } zbiory[stary].clear(); kolor[ktory[a]]=-1; }else if(ka==0 && kb==-1){ int stary=ktory[b]; for(int x:zbiory[ktory[b]]){ zbiory[ktory[a]].insert(x); ktory[x]=ktory[a]; } zbiory[stary].clear(); kolor[ktory[a]]=-1; }else if(ka==0 && kb==1){ kolor[ktory[a]]=1; }else if(ka==-1 && kb==0){ int stary=ktory[b]; for(int x:zbiory[ktory[b]]){ zbiory[ktory[a]].insert(x); ktory[x]=ktory[a]; } zbiory[stary].clear(); kolor[ktory[a]]=-1; }else if(ka==-1 && kb==-1){ if(ktory[a]==ktory[b]){ kolor[ktory[a]]=1; }else{ int stary=ktory[b]; for(int x:zbiory[ktory[b]]){ zbiory[ktory[a]].insert(x); ktory[x]=ktory[a]; } zbiory[stary].clear(); } }else if(ka==-1 && kb==1){ kolor[ktory[a]]=1; }else if(ka==1 && kb==0){ kolor[ktory[b]]=1; }else if(ka==1 && kb==-1){ kolor[ktory[b]]=1; } }else if(c=='-'){ cin>>a; zbiory[ktory[a]].erase(a); if(zbiory[ktory[a]].size()==1 && kolor[ktory[a]]==-1)kolor[ktory[a]]=0; zbiory.push_back({a}); kolor.push_back(0); ktory[a]=zbiory.size()-1; kolor[ktory[a]]=0; }else if(c=='?'){ cin>>a; int stan=kolor[ktory[a]]; if(stan==-1)cout<<'?'; else cout<<stan; } } cout<<endl; return 0; } |