#include<bits/stdc++.h>
using namespace std;
typedef pair<pair<int, int>, int> piii;
#define r first.first
#define ll first.second
#define lk second
int _f(int a, vector<piii> &uf){
while(uf[a].r != uf[uf[a].r].r){
a = uf[a].r;
}
return(a);
}
void _u(int a, int b, vector<piii> &uf){
a = _f(a, uf);
b = _f(b, uf);
uf[b].r = uf[a].r;
uf[a].ll += uf[b].ll;
uf[a].lk += uf[b].lk + 1;
}
void _s(int a, vector<int> &s, vector<piii> &uf, int ts){
for(int i = 0; i < s.size(); i++){
_f(i, uf);
if(a == uf[i].r and (s[i] == 2)){
s[i] = ts;
}
}
}
// -1 - undefined brak
// 0 - brak
// 1 - ma
// 2 - ?
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, q;
cin>>n>>q;
vector<int> s(n, -1);
vector<piii> uf(n, {{0, 1}, 0});
for(int i = 0; i < n; i++){uf[i].r=i;}
char m;
int a, b;
for(int i = 0; i < q; i++){
cin>>m;
if(m == '?'){
cin>>a;
a--;
if(s[a]<=0){cout<<0;}
else if(s[a]==1){cout<<1;}
else {cout<<"?";}
}
else if(m == '+'){
cin>>a>>b;
a--;
b--;
s[a] = 2;
s[b] = 2;
_f(a, uf);
_f(b, uf);
if(uf[a].r != uf[b].r){
_u(a, b, uf);
}
else{
uf[uf[a].r].lk++;
}
if(uf[uf[a].r].ll == uf[uf[a].r].lk){
_s(uf[a].r, s, uf, 1);
}
}
else{
cin>>a;
a--;
_f(a, uf);
s[a] = 0;
uf[uf[a].r].lk--;
if(uf[uf[a].r].lk == 0){
_s(uf[a].r, s, uf, 0);
}
}
}
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 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 | #include<bits/stdc++.h> using namespace std; typedef pair<pair<int, int>, int> piii; #define r first.first #define ll first.second #define lk second int _f(int a, vector<piii> &uf){ while(uf[a].r != uf[uf[a].r].r){ a = uf[a].r; } return(a); } void _u(int a, int b, vector<piii> &uf){ a = _f(a, uf); b = _f(b, uf); uf[b].r = uf[a].r; uf[a].ll += uf[b].ll; uf[a].lk += uf[b].lk + 1; } void _s(int a, vector<int> &s, vector<piii> &uf, int ts){ for(int i = 0; i < s.size(); i++){ _f(i, uf); if(a == uf[i].r and (s[i] == 2)){ s[i] = ts; } } } // -1 - undefined brak // 0 - brak // 1 - ma // 2 - ? int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, q; cin>>n>>q; vector<int> s(n, -1); vector<piii> uf(n, {{0, 1}, 0}); for(int i = 0; i < n; i++){uf[i].r=i;} char m; int a, b; for(int i = 0; i < q; i++){ cin>>m; if(m == '?'){ cin>>a; a--; if(s[a]<=0){cout<<0;} else if(s[a]==1){cout<<1;} else {cout<<"?";} } else if(m == '+'){ cin>>a>>b; a--; b--; s[a] = 2; s[b] = 2; _f(a, uf); _f(b, uf); if(uf[a].r != uf[b].r){ _u(a, b, uf); } else{ uf[uf[a].r].lk++; } if(uf[uf[a].r].ll == uf[uf[a].r].lk){ _s(uf[a].r, s, uf, 1); } } else{ cin>>a; a--; _f(a, uf); s[a] = 0; uf[uf[a].r].lk--; if(uf[uf[a].r].lk == 0){ _s(uf[a].r, s, uf, 0); } } } cout<<"\n"; } |
English