#include <bits/stdc++.h> using namespace std; const int N=3e6; vector<int>pol[N]; int odw[N], nr, pewniaczek[N], kon[N], rev[N], node=1; int rep[N], ile[N], sum[N]; int find(int x) { if (rep[x]!=x) rep[x]=find(rep[x]); return rep[x]; } void uni(int a, int b) { a=find(a); b=find(b); if (a==b) return; if (ile[a]<ile[b]) swap(a, b); rep[b]=a; ile[a]+=ile[b]; sum[a]+=sum[b]; } void dfs(int w, int k, int c) { odw[w]=c; for (auto i : pol[w]) if (odw[i] != c) dfs(i, k, c); pewniaczek[rev[w]]=1; kon[rev[w]]=0; rev[w]=0; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; cin>>n>>q; for (int tt=0; tt<q; tt++) { char c; cin>>c; if (c == '+') { int a, b; cin>>a>>b; if (!kon[a]) { rep[node]=node, ile[node]=1, sum[node]=1; rev[node]=a, kon[a]=node++; } if (!kon[b]) { rep[node]=node, ile[node]=1, sum[node]=1; rev[node]=b, kon[b]=node++; } pol[kon[a]].push_back(kon[b]); pol[kon[b]].push_back(kon[a]); if (pewniaczek[a] || pewniaczek[b] || find(kon[a])==find(kon[b])) { //~ cout<<"PEWNIAK "<<a<<" "<<b<<endl; dfs(kon[a], b, ++nr); } else uni(kon[a], kon[b]); } if (c == '-') { int a; cin>>a; pewniaczek[a]=0; rev[kon[a]]=0; sum[find(kon[a])]--; kon[a]=0; } if (c == '?') { int a; cin>>a; if (pewniaczek[a]) cout<<1; else if (kon[a] && sum[find(kon[a])]>1) cout<<"?"; else cout<<0; //~ cout<<"\nXD "<<a<<" "<<kon[a]<<" "<<sum(kon[a], ++nr)<<endl; } } 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 | #include <bits/stdc++.h> using namespace std; const int N=3e6; vector<int>pol[N]; int odw[N], nr, pewniaczek[N], kon[N], rev[N], node=1; int rep[N], ile[N], sum[N]; int find(int x) { if (rep[x]!=x) rep[x]=find(rep[x]); return rep[x]; } void uni(int a, int b) { a=find(a); b=find(b); if (a==b) return; if (ile[a]<ile[b]) swap(a, b); rep[b]=a; ile[a]+=ile[b]; sum[a]+=sum[b]; } void dfs(int w, int k, int c) { odw[w]=c; for (auto i : pol[w]) if (odw[i] != c) dfs(i, k, c); pewniaczek[rev[w]]=1; kon[rev[w]]=0; rev[w]=0; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; cin>>n>>q; for (int tt=0; tt<q; tt++) { char c; cin>>c; if (c == '+') { int a, b; cin>>a>>b; if (!kon[a]) { rep[node]=node, ile[node]=1, sum[node]=1; rev[node]=a, kon[a]=node++; } if (!kon[b]) { rep[node]=node, ile[node]=1, sum[node]=1; rev[node]=b, kon[b]=node++; } pol[kon[a]].push_back(kon[b]); pol[kon[b]].push_back(kon[a]); if (pewniaczek[a] || pewniaczek[b] || find(kon[a])==find(kon[b])) { //~ cout<<"PEWNIAK "<<a<<" "<<b<<endl; dfs(kon[a], b, ++nr); } else uni(kon[a], kon[b]); } if (c == '-') { int a; cin>>a; pewniaczek[a]=0; rev[kon[a]]=0; sum[find(kon[a])]--; kon[a]=0; } if (c == '?') { int a; cin>>a; if (pewniaczek[a]) cout<<1; else if (kon[a] && sum[find(kon[a])]>1) cout<<"?"; else cout<<0; //~ cout<<"\nXD "<<a<<" "<<kon[a]<<" "<<sum(kon[a], ++nr)<<endl; } } cout<<"\n"; } |