#include<bits/stdc++.h>
using namespace std;
int gdzie[1310000];
set<int> secik[1310000];
int stan[1310000];
int nowy;
int32_t main()
{
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
int n,zap;
cin>>n>>zap;
nowy=n+1;
for(int i=1;i<=n;i++)
gdzie[i]=i,secik[i].insert(i),stan[i]=0;
while(zap--)
{
char c;
cin>>c;
if(c=='?')
{
int x;
cin>>x;
if(secik[gdzie[x]].size()>1)
cout<<"?";
else cout<<stan[x];
}
else if(c=='+')
{
int x,y;
cin>>x>>y;
if(gdzie[x]==gdzie[y])
{
int cos=gdzie[x];
for(auto it=secik[cos].begin();it!=secik[cos].end();it++)
{
stan[*it]=1;
gdzie[*it]=*it;
secik[*it].insert(*it);
}
secik[cos].clear();
if(x==y)
secik[x].insert(x),gdzie[x]=x,stan[x]=1;
}
else{
if(secik[gdzie[x]].size()==1 && secik[gdzie[y]].size()==1)
{
if(stan[x]==1 || stan[y]==1)
stan[x]=1,stan[y]=1;
else{
gdzie[x]=nowy;
gdzie[y]=nowy;
secik[x].erase(x);
secik[y].erase(y);
secik[nowy].insert(y);
secik[nowy].insert(x);
nowy++;
}
}
else if(secik[gdzie[x]].size()>1 && secik[gdzie[y]].size()>1)
{
if(secik[gdzie[x]].size()>secik[gdzie[y]].size())
swap(x,y);
int cos=gdzie[x];
for(auto it=secik[cos].begin();it!=secik[cos].end();it++)
{
gdzie[*it]=gdzie[y];
secik[gdzie[y]].insert(*it);
}
secik[cos].clear();
}
else{
if(secik[gdzie[x]].size()>secik[gdzie[y]].size())
swap(x,y);
if(stan[x]==0)
{
gdzie[x]=gdzie[y];
secik[gdzie[x]].erase(x);
secik[gdzie[y]].insert(x);
}
else{
int cos=gdzie[y];
for(auto it=secik[cos].begin();it!=secik[cos].end();it++)
{
stan[*it]=1;
gdzie[*it]=*it;
secik[*it].insert(*it);
}
secik[cos].clear();
}
}
}
}
else if(c=='-')
{
int x;
cin>>x;
if(secik[gdzie[x]].size()==1)
stan[x]=0;
else{
secik[gdzie[x]].erase(x);
if(secik[gdzie[x]].size()==1)
{
auto it=secik[gdzie[x]].begin();
int y=(*it);
secik[gdzie[x]].erase(it);
stan[y]=0;
secik[x].insert(x);
secik[y].insert(y);
gdzie[y]=y;
gdzie[x]=x;
}
else{
gdzie[x]=x;
secik[x].insert(x);
}
stan[x]=0;
}
}
}
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 122 123 | #include<bits/stdc++.h> using namespace std; int gdzie[1310000]; set<int> secik[1310000]; int stan[1310000]; int nowy; int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); int n,zap; cin>>n>>zap; nowy=n+1; for(int i=1;i<=n;i++) gdzie[i]=i,secik[i].insert(i),stan[i]=0; while(zap--) { char c; cin>>c; if(c=='?') { int x; cin>>x; if(secik[gdzie[x]].size()>1) cout<<"?"; else cout<<stan[x]; } else if(c=='+') { int x,y; cin>>x>>y; if(gdzie[x]==gdzie[y]) { int cos=gdzie[x]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { stan[*it]=1; gdzie[*it]=*it; secik[*it].insert(*it); } secik[cos].clear(); if(x==y) secik[x].insert(x),gdzie[x]=x,stan[x]=1; } else{ if(secik[gdzie[x]].size()==1 && secik[gdzie[y]].size()==1) { if(stan[x]==1 || stan[y]==1) stan[x]=1,stan[y]=1; else{ gdzie[x]=nowy; gdzie[y]=nowy; secik[x].erase(x); secik[y].erase(y); secik[nowy].insert(y); secik[nowy].insert(x); nowy++; } } else if(secik[gdzie[x]].size()>1 && secik[gdzie[y]].size()>1) { if(secik[gdzie[x]].size()>secik[gdzie[y]].size()) swap(x,y); int cos=gdzie[x]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { gdzie[*it]=gdzie[y]; secik[gdzie[y]].insert(*it); } secik[cos].clear(); } else{ if(secik[gdzie[x]].size()>secik[gdzie[y]].size()) swap(x,y); if(stan[x]==0) { gdzie[x]=gdzie[y]; secik[gdzie[x]].erase(x); secik[gdzie[y]].insert(x); } else{ int cos=gdzie[y]; for(auto it=secik[cos].begin();it!=secik[cos].end();it++) { stan[*it]=1; gdzie[*it]=*it; secik[*it].insert(*it); } secik[cos].clear(); } } } } else if(c=='-') { int x; cin>>x; if(secik[gdzie[x]].size()==1) stan[x]=0; else{ secik[gdzie[x]].erase(x); if(secik[gdzie[x]].size()==1) { auto it=secik[gdzie[x]].begin(); int y=(*it); secik[gdzie[x]].erase(it); stan[y]=0; secik[x].insert(x); secik[y].insert(y); gdzie[y]=y; gdzie[x]=x; } else{ gdzie[x]=x; secik[x].insert(x); } stan[x]=0; } } } return 0; } |
English