#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define pb push_back
#define fi first
#define se second
#define rep(i,b,e) for(int i=(b); i<(e); i++)
#define each(a,x) for(auto &a : (x))
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
struct DSU{
vi par,cnt,cntPC;
DSU(int n){
n+=5;
cnt.resize(n);
par.resize(n);
cntPC.resize(n);
for(int i=0; i<n; ++i){
par[i] = i;
cnt[i] = 1;
cntPC[i] = 0;
}
}
int Find(int a){
if(a!=par[a]) par[a] = Find(par[a]);
return par[a];
}
bool Union(int a, int b){
a = Find(a);
b = Find(b);
if(a==b) return false;
if(cnt[a] < cnt[b]) swap(a,b);
par[b] = a;
cnt[a] += cnt[b];
cntPC[a] += cntPC[b];
return true;
}
};
const int N = 1e6+4e5;
DSU dsu(N);
int rep[N],id;
void Remove(int v){
int S = dsu.Find(rep[v]);
dsu.cnt[S]--;
dsu.cntPC[S]--;
rep[v] = id++;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,q;
cin >> n >> q;
for(int i=0; i<=n+5; ++i)
rep[i] = i;
id = n+10;
while(q--){
char c;
cin >> c;
if(c=='+'){
int a,b;
cin >> a >> b;
a = rep[a];
b = rep[b];
dsu.Union(a,b);
int S = dsu.Find(a);
++dsu.cntPC[S];
}else if(c=='-'){
int a;
cin >> a;
Remove(a);
}else{
int a;
cin >> a;
a = rep[a];
int S = dsu.Find(a);
// cout << "CNT:" << dsu.cnt[S] << endl;
// cout << "CNTPc:" << dsu.cntPC[S] << endl;
if(dsu.cnt[S]==dsu.cntPC[S]) cout << 1;
else if(dsu.cntPC[S]>0) cout << "?";
else cout << 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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double db; typedef pair<int,int> pii; typedef vector<int> vi; #define pb push_back #define fi first #define se second #define rep(i,b,e) for(int i=(b); i<(e); i++) #define each(a,x) for(auto &a : (x)) #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() struct DSU{ vi par,cnt,cntPC; DSU(int n){ n+=5; cnt.resize(n); par.resize(n); cntPC.resize(n); for(int i=0; i<n; ++i){ par[i] = i; cnt[i] = 1; cntPC[i] = 0; } } int Find(int a){ if(a!=par[a]) par[a] = Find(par[a]); return par[a]; } bool Union(int a, int b){ a = Find(a); b = Find(b); if(a==b) return false; if(cnt[a] < cnt[b]) swap(a,b); par[b] = a; cnt[a] += cnt[b]; cntPC[a] += cntPC[b]; return true; } }; const int N = 1e6+4e5; DSU dsu(N); int rep[N],id; void Remove(int v){ int S = dsu.Find(rep[v]); dsu.cnt[S]--; dsu.cntPC[S]--; rep[v] = id++; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n,q; cin >> n >> q; for(int i=0; i<=n+5; ++i) rep[i] = i; id = n+10; while(q--){ char c; cin >> c; if(c=='+'){ int a,b; cin >> a >> b; a = rep[a]; b = rep[b]; dsu.Union(a,b); int S = dsu.Find(a); ++dsu.cntPC[S]; }else if(c=='-'){ int a; cin >> a; Remove(a); }else{ int a; cin >> a; a = rep[a]; int S = dsu.Find(a); // cout << "CNT:" << dsu.cnt[S] << endl; // cout << "CNTPc:" << dsu.cntPC[S] << endl; if(dsu.cnt[S]==dsu.cntPC[S]) cout << 1; else if(dsu.cntPC[S]>0) cout << "?"; else cout << 0; } } return 0; } |
English