#include <bits/stdc++.h> using namespace std; #define ll long long #define f first #define s second int maxn=300003, ilj, gdzj, iw; vector<vector<int>> v(maxn); vector<short> war(maxn); vector<bool> vis(maxn); void dfs(int u){ vis[u]=true; iw++; if (war[u]==1){ ilj++; gdzj=u; } if (ilj>1) return; for (auto i:v[u]){ if (!vis[i]) dfs(i); } } void dfsdj(int u){ vis[u]=true; if (war[u]==1) war[u]=2; for (auto i:v[u]){ if (!vis[i]) dfsdj(i); } } void dfsus(int u){ vis[u]=false; for (int i=0; i<v[u].size(); i++){ int zz=v[u][i]; if ((!war[zz] && !war[u]) || (war[zz]==war[u]==2)){ v[u].erase(v[u].begin() + i); for (int j=0; j<v[zz].size(); j++){ if (v[zz][j]==u){ v[zz].erase(v[zz].begin() +j); break; } } } if (vis[zz]) dfsus(zz); } } bool jcykl=false; void cykl(int u, int sk){ vis[u]=true; for (auto i:v[u]){ if (vis[i] && i!=sk){ jcykl=true; return; } if (!vis[i]) cykl(i, u); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N, Q; cin >> N >> Q; for (int q=0; q<Q; q++){ char zn; int a, b; cin >> zn >> a; if (zn=='?'){ if (war[a]==1){ cout << '?'; continue; } if (war[a]==2){ cout << '1'; continue; } cout << war[a]; continue; } if (zn=='-'){ war[a]=0; ilj=gdzj=iw=0; dfs(a); if (ilj==1){ war[gdzj]=0; } dfsus(a); continue; } cin >> b; v[a].push_back(b); v[b].push_back(a); if (war[a]==2 || war[b]==2){ war[a]=war[b]=2; continue; } if ((!war[a] || !war[b]) && (a!=b)){ war[a]=1; war[b]=1; continue; } if (a==b && !war[a]){ war[a]=2; continue; } if (a==b){ war[a]=2; dfsdj(a); dfsus(a); continue; } // spr czy jest cykl jcykl=false; cykl(a, -1); dfsus(a); if (jcykl) { dfsdj(a); dfsus(a); } } 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 115 116 117 118 119 120 121 | #include <bits/stdc++.h> using namespace std; #define ll long long #define f first #define s second int maxn=300003, ilj, gdzj, iw; vector<vector<int>> v(maxn); vector<short> war(maxn); vector<bool> vis(maxn); void dfs(int u){ vis[u]=true; iw++; if (war[u]==1){ ilj++; gdzj=u; } if (ilj>1) return; for (auto i:v[u]){ if (!vis[i]) dfs(i); } } void dfsdj(int u){ vis[u]=true; if (war[u]==1) war[u]=2; for (auto i:v[u]){ if (!vis[i]) dfsdj(i); } } void dfsus(int u){ vis[u]=false; for (int i=0; i<v[u].size(); i++){ int zz=v[u][i]; if ((!war[zz] && !war[u]) || (war[zz]==war[u]==2)){ v[u].erase(v[u].begin() + i); for (int j=0; j<v[zz].size(); j++){ if (v[zz][j]==u){ v[zz].erase(v[zz].begin() +j); break; } } } if (vis[zz]) dfsus(zz); } } bool jcykl=false; void cykl(int u, int sk){ vis[u]=true; for (auto i:v[u]){ if (vis[i] && i!=sk){ jcykl=true; return; } if (!vis[i]) cykl(i, u); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N, Q; cin >> N >> Q; for (int q=0; q<Q; q++){ char zn; int a, b; cin >> zn >> a; if (zn=='?'){ if (war[a]==1){ cout << '?'; continue; } if (war[a]==2){ cout << '1'; continue; } cout << war[a]; continue; } if (zn=='-'){ war[a]=0; ilj=gdzj=iw=0; dfs(a); if (ilj==1){ war[gdzj]=0; } dfsus(a); continue; } cin >> b; v[a].push_back(b); v[b].push_back(a); if (war[a]==2 || war[b]==2){ war[a]=war[b]=2; continue; } if ((!war[a] || !war[b]) && (a!=b)){ war[a]=1; war[b]=1; continue; } if (a==b && !war[a]){ war[a]=2; continue; } if (a==b){ war[a]=2; dfsdj(a); dfsus(a); continue; } // spr czy jest cykl jcykl=false; cykl(a, -1); dfsus(a); if (jcykl) { dfsdj(a); dfsus(a); } } return 0; } |