#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=2e6+7;
vector<int>V[LIM];
int F[LIM], czy[LIM], kto[LIM], ile[LIM], n;
int fnd(int x) {
if(F[x]==x) return x;
return F[x]=fnd(F[x]);
}
void wlacz(int x) {
x=fnd(x);
vector<int>P=V[x];
for(auto i : P) {
V[i].clear();
V[i].pb(i);
F[i]=i;
czy[i]=1;
}
}
void wylacz(int x) {
kto[x]=n;
F[n]=n;
V[n].pb(n);
ile[n]=1;
++n;
}
void uni(int a, int b) {
a=fnd(a); b=fnd(b);
if(V[a].size()<V[b].size()) swap(a, b);
for(auto i : V[b]) V[a].pb(i);
V[b].clear();
ile[a]+=ile[b];
F[b]=a;
}
void lacz(int a, int b) {
if(czy[a]) {
if(!czy[b]) wlacz(b);
return;
}
if(czy[b]) {
if(!czy[a]) wlacz(a);
return;
}
if(fnd(a)==fnd(b)) wlacz(a);
else uni(a, b);
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int q;
cin >> n >> q;
rep(i, n) {
F[i]=i;
kto[i]=i;
ile[i]=1;
V[i].pb(i);
}
while(q--) {
char t;
cin >> t;
if(t=='+') {
int a, b;
cin >> a >> b; --a; --b;
a=kto[a];
b=kto[b];
lacz(a, b);
} else if(t=='-') {
int a;
cin >> a; --a;
--ile[fnd(kto[a])];
wylacz(a);
} else {
int a;
cin >> a; --a;
a=kto[a];
if(czy[a]) {
cout << 1;
continue;
}
cout << (ile[fnd(a)]>1?"?":"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 | #include<bits/stdc++.h> using namespace std; typedef long double ld; typedef long long ll; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=2e6+7; vector<int>V[LIM]; int F[LIM], czy[LIM], kto[LIM], ile[LIM], n; int fnd(int x) { if(F[x]==x) return x; return F[x]=fnd(F[x]); } void wlacz(int x) { x=fnd(x); vector<int>P=V[x]; for(auto i : P) { V[i].clear(); V[i].pb(i); F[i]=i; czy[i]=1; } } void wylacz(int x) { kto[x]=n; F[n]=n; V[n].pb(n); ile[n]=1; ++n; } void uni(int a, int b) { a=fnd(a); b=fnd(b); if(V[a].size()<V[b].size()) swap(a, b); for(auto i : V[b]) V[a].pb(i); V[b].clear(); ile[a]+=ile[b]; F[b]=a; } void lacz(int a, int b) { if(czy[a]) { if(!czy[b]) wlacz(b); return; } if(czy[b]) { if(!czy[a]) wlacz(a); return; } if(fnd(a)==fnd(b)) wlacz(a); else uni(a, b); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int q; cin >> n >> q; rep(i, n) { F[i]=i; kto[i]=i; ile[i]=1; V[i].pb(i); } while(q--) { char t; cin >> t; if(t=='+') { int a, b; cin >> a >> b; --a; --b; a=kto[a]; b=kto[b]; lacz(a, b); } else if(t=='-') { int a; cin >> a; --a; --ile[fnd(kto[a])]; wylacz(a); } else { int a; cin >> a; --a; a=kto[a]; if(czy[a]) { cout << 1; continue; } cout << (ile[fnd(a)]>1?"?":"0"); } } cout << '\n'; } |
English