#include<iostream> #include<algorithm> #include<vector> using namespace std; vector<int> ch[300001]; bool j[300001]; struct FAU { int *p,*w; FAU(int n) : p(new int[n]), w(new int[n]) { for(int x=0; x<n; ++x) p[x] = w[x] = -1; } ~FAU() { delete[]p; delete[]w; } int Find(int x) { return (p[x] < 0) ? x : Find(p[x]); } void Union(int x, int y) { if((x = Find(x)) == (y = Find(y))) return; if(j[x] || j[y]) j[x] = j[y] = true; if(w[x] > w[y]) { p[y] = x; ch[x].push_back(y); } else { p[x] = y; ch[y].push_back(x); } if(w[x] == w[y]) w[y]++; } void deletion(int x) { if(p[x] != -1) for(int i=0; i<ch[p[x]].size(); ++i) { if(ch[p[x]][i] == x) ch[p[x]].erase(ch[p[x]].begin()+i); } int nr,l; l = ch[x].size(); if(l == 0) { p[x] = w[x] = -1; j[x] = false; return; } nr = ch[x][(l-1)/3]; p[nr] = p[x]; w[nr] = w[x]; j[nr] = j[x]; for(int i=0; i<l; ++i) { if(i != (l-1)/3) { ch[nr].push_back(ch[x][i]); p[ch[x][i]] = nr; } } if(p[x] != -1) ch[p[x]].push_back(nr); ch[x].clear(); p[x] = w[x] = -1; j[x] = false; } }; int main() { ios::sync_with_stdio(0); int N,Q; cin>>N>>Q; j[N] = true; for(int i=0; i<N; ++i) j[i] = false; FAU fau(N+1); char A; for(int i=0; i<Q; ++i) { cin>>A; if(A == '+') { int a,b; cin>>a>>b; a--; b--; a = fau.Find(a); b = fau.Find(b); if(a == b) { fau.Union(a,N); } else { fau.Union(a,b); } } if(A == '-') { int c; cin>>c; c--; fau.deletion(c); } if(A == '?') { int d; cin>>d; d--; d = fau.Find(d); if(j[d]) cout<<"1"; else if(ch[d].size() == 0) cout<<"0"; else cout<<"?"; } } 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 98 99 100 101 102 103 104 105 106 | #include<iostream> #include<algorithm> #include<vector> using namespace std; vector<int> ch[300001]; bool j[300001]; struct FAU { int *p,*w; FAU(int n) : p(new int[n]), w(new int[n]) { for(int x=0; x<n; ++x) p[x] = w[x] = -1; } ~FAU() { delete[]p; delete[]w; } int Find(int x) { return (p[x] < 0) ? x : Find(p[x]); } void Union(int x, int y) { if((x = Find(x)) == (y = Find(y))) return; if(j[x] || j[y]) j[x] = j[y] = true; if(w[x] > w[y]) { p[y] = x; ch[x].push_back(y); } else { p[x] = y; ch[y].push_back(x); } if(w[x] == w[y]) w[y]++; } void deletion(int x) { if(p[x] != -1) for(int i=0; i<ch[p[x]].size(); ++i) { if(ch[p[x]][i] == x) ch[p[x]].erase(ch[p[x]].begin()+i); } int nr,l; l = ch[x].size(); if(l == 0) { p[x] = w[x] = -1; j[x] = false; return; } nr = ch[x][(l-1)/3]; p[nr] = p[x]; w[nr] = w[x]; j[nr] = j[x]; for(int i=0; i<l; ++i) { if(i != (l-1)/3) { ch[nr].push_back(ch[x][i]); p[ch[x][i]] = nr; } } if(p[x] != -1) ch[p[x]].push_back(nr); ch[x].clear(); p[x] = w[x] = -1; j[x] = false; } }; int main() { ios::sync_with_stdio(0); int N,Q; cin>>N>>Q; j[N] = true; for(int i=0; i<N; ++i) j[i] = false; FAU fau(N+1); char A; for(int i=0; i<Q; ++i) { cin>>A; if(A == '+') { int a,b; cin>>a>>b; a--; b--; a = fau.Find(a); b = fau.Find(b); if(a == b) { fau.Union(a,N); } else { fau.Union(a,b); } } if(A == '-') { int c; cin>>c; c--; fau.deletion(c); } if(A == '?') { int d; cin>>d; d--; d = fau.Find(d); if(j[d]) cout<<"1"; else if(ch[d].size() == 0) cout<<"0"; else cout<<"?"; } } cout<<endl; return 0; } |