#include<bits/stdc++.h>
using namespace std;
vector<int>V[1300009];
int spojna[300009],numer[300009];
bool duppa[300009];
int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,q,h;
cin>>n>>q;
h=n;
for(int i=1;i<=n;i++)
{
spojna[i]=i;
numer[i]=0;
V[i]={i};
}
for(int i=1;i<=q;i++)
{
char z;
cin>>z;
if(z=='?')
{
int v;
cin>>v;
if(duppa[v]){cout<<1;}
else if(V[spojna[v]].size()==1){cout<<0;}
else{cout<<'?';}
}
else if(z=='+')
{
int a,b;
cin>>a>>b;
if(duppa[b]){swap(a,b);}
if(duppa[a]||spojna[a]==spojna[b])
{
int u=spojna[b];
for(int v : V[u])
{
duppa[v]=1;
}
V[u].clear();
}
else
{
if(spojna[a]<spojna[b]){swap(a,b);}
int u1=spojna[a],u2=spojna[b];
for(int v : V[u2])
{
spojna[v]=u1;
numer[v]=V[u1].size();
V[u1].push_back(v);
}
V[u2].clear();
}
}
else if(z=='-')
{
int v,u;
cin>>v;
u=spojna[v];
if(V[u].size()==1){continue;}
if(duppa[v])
{
duppa[v]=0;
h++;
V[h]={v};
spojna[v]=h;
numer[v]=0;
continue;
}
if(numer[v]==V[u].size()-1)
{
V[u].pop_back();
}
else
{
numer[V[u].back()]=numer[v];
swap(V[u][V[u].size()-1],V[u][numer[v]]);
V[u].pop_back();
}
h++;
spojna[v]=h;
numer[v]=0;
V[h]={v};
}
}
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 | #include<bits/stdc++.h> using namespace std; vector<int>V[1300009]; int spojna[300009],numer[300009]; bool duppa[300009]; int main() {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n,q,h; cin>>n>>q; h=n; for(int i=1;i<=n;i++) { spojna[i]=i; numer[i]=0; V[i]={i}; } for(int i=1;i<=q;i++) { char z; cin>>z; if(z=='?') { int v; cin>>v; if(duppa[v]){cout<<1;} else if(V[spojna[v]].size()==1){cout<<0;} else{cout<<'?';} } else if(z=='+') { int a,b; cin>>a>>b; if(duppa[b]){swap(a,b);} if(duppa[a]||spojna[a]==spojna[b]) { int u=spojna[b]; for(int v : V[u]) { duppa[v]=1; } V[u].clear(); } else { if(spojna[a]<spojna[b]){swap(a,b);} int u1=spojna[a],u2=spojna[b]; for(int v : V[u2]) { spojna[v]=u1; numer[v]=V[u1].size(); V[u1].push_back(v); } V[u2].clear(); } } else if(z=='-') { int v,u; cin>>v; u=spojna[v]; if(V[u].size()==1){continue;} if(duppa[v]) { duppa[v]=0; h++; V[h]={v}; spojna[v]=h; numer[v]=0; continue; } if(numer[v]==V[u].size()-1) { V[u].pop_back(); } else { numer[V[u].back()]=numer[v]; swap(V[u][V[u].size()-1],V[u][numer[v]]); V[u].pop_back(); } h++; spojna[v]=h; numer[v]=0; V[h]={v}; } } cout<<'\n'; return 0; } |
English