#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=a; i<=b; ++i)
#define FORR(i,a,b) for(int i=a; i>=b; --i)
#define ssize(v) (int)(v.size())
#define eb push_back
constexpr int MAX_N=3e5+14, MAX_Q=1e6+14;
int N, qtQ;
char rres[MAX_N];
int fau[MAX_N];
vector<int> vecFrom[MAX_N];
void Input(){
cin>>N>>qtQ;
FOR(i,1,N){
rres[i]='0';
fau[i]=i;
vecFrom[i]={i};
}
}
int Find(int v){
if(fau[v]==v)
return v;
fau[v]=Find(fau[v]);
return fau[v];
}
void Union(int a, int b){
vecFrom[Find(a)].insert(vecFrom[Find(a)].end(),
vecFrom[Find(b)].begin(), vecFrom[Find(b)].end());
vecFrom[Find(b)].clear();
vecFrom[Find(a)].shrink_to_fit(), vecFrom[Find(b)].shrink_to_fit();
fau[Find(b)] = Find(a);
}
void Add(int a){
for(auto nE:vecFrom[a]){
if(nE==a) continue;
rres[nE]='1';
fau[nE]=nE;
vecFrom[nE]={nE};
}
rres[a]='1';
fau[a]=a;
vecFrom[a]={a};
}
void Minus(int a){
if(ssize(vecFrom[Find(a)])==1) return;
int firD=0;
for(auto cE:vecFrom[Find(a)])
if(cE!=a) {firD=cE; break;}
if(ssize(vecFrom[Find(a)])==2){
fau[firD]=firD;
vecFrom[firD]={firD};
rres[firD]='0';
fau[a]=a;
vecFrom[a]={a};
return;
}
if(Find(a)==a){
vecFrom[firD].clear();
FOR(i,0,ssize(vecFrom[a])-1){
if(vecFrom[a][i]==a) continue;
vecFrom[firD].eb(vecFrom[a][i]);
fau[vecFrom[a][i]]=firD;
}
fau[a]=a, vecFrom[a]={a};
}else{
FOR(i,0,ssize(vecFrom[fau[a]])-1) if(vecFrom[fau[a]][i]==a){vecFrom[fau[a]].erase(vecFrom[fau[a]].begin()+i); break;};
FOR(i,0,ssize(vecFrom[fau[a]])-1) fau[vecFrom[fau[a]][i]]=fau[a];
fau[a]=a, vecFrom[a]={a};
vecFrom[fau[a]].shrink_to_fit();
vecFrom[a].shrink_to_fit();
return;
}
}
void Solve(){
char a;
int b, c;
FOR(qq,1,qtQ){
cin>>a;
if(a=='?') cin>>b, cout<<rres[b];
else if(a=='+'){
cin>>b>>c;
if(rres[b]=='1'&&rres[c]=='1') {}
else if(rres[b]=='1') Add(Find(c));
else if(rres[c]=='1') Add(Find(b));
else if(Find(b)==Find(c)){
Add(Find(b));
}else{
Union(b,c);
rres[b]='?', rres[c]='?';
}
}else{
cin>>b;
if(rres[b]=='?') Minus(b);
rres[b]='0';
}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
Input();
Solve();
}
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 | #include <bits/stdc++.h> using namespace std; #define FOR(i,a,b) for(int i=a; i<=b; ++i) #define FORR(i,a,b) for(int i=a; i>=b; --i) #define ssize(v) (int)(v.size()) #define eb push_back constexpr int MAX_N=3e5+14, MAX_Q=1e6+14; int N, qtQ; char rres[MAX_N]; int fau[MAX_N]; vector<int> vecFrom[MAX_N]; void Input(){ cin>>N>>qtQ; FOR(i,1,N){ rres[i]='0'; fau[i]=i; vecFrom[i]={i}; } } int Find(int v){ if(fau[v]==v) return v; fau[v]=Find(fau[v]); return fau[v]; } void Union(int a, int b){ vecFrom[Find(a)].insert(vecFrom[Find(a)].end(), vecFrom[Find(b)].begin(), vecFrom[Find(b)].end()); vecFrom[Find(b)].clear(); vecFrom[Find(a)].shrink_to_fit(), vecFrom[Find(b)].shrink_to_fit(); fau[Find(b)] = Find(a); } void Add(int a){ for(auto nE:vecFrom[a]){ if(nE==a) continue; rres[nE]='1'; fau[nE]=nE; vecFrom[nE]={nE}; } rres[a]='1'; fau[a]=a; vecFrom[a]={a}; } void Minus(int a){ if(ssize(vecFrom[Find(a)])==1) return; int firD=0; for(auto cE:vecFrom[Find(a)]) if(cE!=a) {firD=cE; break;} if(ssize(vecFrom[Find(a)])==2){ fau[firD]=firD; vecFrom[firD]={firD}; rres[firD]='0'; fau[a]=a; vecFrom[a]={a}; return; } if(Find(a)==a){ vecFrom[firD].clear(); FOR(i,0,ssize(vecFrom[a])-1){ if(vecFrom[a][i]==a) continue; vecFrom[firD].eb(vecFrom[a][i]); fau[vecFrom[a][i]]=firD; } fau[a]=a, vecFrom[a]={a}; }else{ FOR(i,0,ssize(vecFrom[fau[a]])-1) if(vecFrom[fau[a]][i]==a){vecFrom[fau[a]].erase(vecFrom[fau[a]].begin()+i); break;}; FOR(i,0,ssize(vecFrom[fau[a]])-1) fau[vecFrom[fau[a]][i]]=fau[a]; fau[a]=a, vecFrom[a]={a}; vecFrom[fau[a]].shrink_to_fit(); vecFrom[a].shrink_to_fit(); return; } } void Solve(){ char a; int b, c; FOR(qq,1,qtQ){ cin>>a; if(a=='?') cin>>b, cout<<rres[b]; else if(a=='+'){ cin>>b>>c; if(rres[b]=='1'&&rres[c]=='1') {} else if(rres[b]=='1') Add(Find(c)); else if(rres[c]=='1') Add(Find(b)); else if(Find(b)==Find(c)){ Add(Find(b)); }else{ Union(b,c); rres[b]='?', rres[c]='?'; } }else{ cin>>b; if(rres[b]=='?') Minus(b); rres[b]='0'; } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); Input(); Solve(); } |
English