#include <bits/stdc++.h>
#define FOR(i,p,k) for(int i=(p);i<=(k);++i)
#define REP(i,n) FOR(i,0,(n)-1)
#define ssize(x) (int((x).size()))
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define gc getchar_unlocked
#define pc putchar_unlocked
using namespace std;
void wczytaj(int &a){
int c = gc();
while(c < '0' || c > '9') c = gc();
for(a = 0; c >= '0' && c <= '9'; c = gc()) a = 10*a+c-'0';
}
void znak(int &c){
c = gc();
while(c!='?' && c!='+' && c!='-') c = gc();
}
struct znajdz_i_polacz{
vector<int> r, rozm;
znajdz_i_polacz(int n){
r.resize(n+1);
rozm.resize(n+1, 1);
FOR(i, 0, n) r[i] = i;
}
int f(int x){
if(r[x] != x) r[x] = f(r[x]);
return r[x];
}
void u(int a, int b){
a = f(a), b = f(b);
if(rozm[a] > rozm[b]) swap(a, b);
if(a != b) r[a] = b, rozm[b] += rozm[a];
}
};
void solve(){
int n, q;
wczytaj(n), wczytaj(q);
znajdz_i_polacz janusz(n+q);
vector<bool> smierc(n+q+1, 0);
vector<int> nr(n+1);
FOR(i, 1, n) nr[i] = i;
FOR(numer_akt, n+1, n+q){
int c;
znak(c);
if(c == '+'){
int a, b;
wczytaj(a), wczytaj(b);
int fa = janusz.f(nr[a]);
int fb = janusz.f(nr[b]);
if(nr[a] && smierc[fa]) nr[a] = 0;
if(nr[b] && smierc[fb]) nr[b] = 0;
if(!nr[a] || !nr[b] || fa==fb) smierc[fa] = smierc[fb] = 1;
else janusz.u(fa, fb);
}
else if(c == '-'){
int a;
wczytaj(a);
int fa = janusz.f(nr[a]);
if(nr[a] && smierc[fa]) nr[a] = 0;
if(nr[a]) --janusz.rozm[fa];
nr[a] = numer_akt;
}
else{
int a;
wczytaj(a);
int fa = janusz.f(nr[a]);
if(nr[a] && smierc[fa]) nr[a] = 0;
if(!nr[a]) pc('1');
else if(janusz.rozm[fa] == 1) pc('0');
else pc('?');
}
}
}
int main(){
solve();
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 | #include <bits/stdc++.h> #define FOR(i,p,k) for(int i=(p);i<=(k);++i) #define REP(i,n) FOR(i,0,(n)-1) #define ssize(x) (int((x).size())) #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define gc getchar_unlocked #define pc putchar_unlocked using namespace std; void wczytaj(int &a){ int c = gc(); while(c < '0' || c > '9') c = gc(); for(a = 0; c >= '0' && c <= '9'; c = gc()) a = 10*a+c-'0'; } void znak(int &c){ c = gc(); while(c!='?' && c!='+' && c!='-') c = gc(); } struct znajdz_i_polacz{ vector<int> r, rozm; znajdz_i_polacz(int n){ r.resize(n+1); rozm.resize(n+1, 1); FOR(i, 0, n) r[i] = i; } int f(int x){ if(r[x] != x) r[x] = f(r[x]); return r[x]; } void u(int a, int b){ a = f(a), b = f(b); if(rozm[a] > rozm[b]) swap(a, b); if(a != b) r[a] = b, rozm[b] += rozm[a]; } }; void solve(){ int n, q; wczytaj(n), wczytaj(q); znajdz_i_polacz janusz(n+q); vector<bool> smierc(n+q+1, 0); vector<int> nr(n+1); FOR(i, 1, n) nr[i] = i; FOR(numer_akt, n+1, n+q){ int c; znak(c); if(c == '+'){ int a, b; wczytaj(a), wczytaj(b); int fa = janusz.f(nr[a]); int fb = janusz.f(nr[b]); if(nr[a] && smierc[fa]) nr[a] = 0; if(nr[b] && smierc[fb]) nr[b] = 0; if(!nr[a] || !nr[b] || fa==fb) smierc[fa] = smierc[fb] = 1; else janusz.u(fa, fb); } else if(c == '-'){ int a; wczytaj(a); int fa = janusz.f(nr[a]); if(nr[a] && smierc[fa]) nr[a] = 0; if(nr[a]) --janusz.rozm[fa]; nr[a] = numer_akt; } else{ int a; wczytaj(a); int fa = janusz.f(nr[a]); if(nr[a] && smierc[fa]) nr[a] = 0; if(!nr[a]) pc('1'); else if(janusz.rozm[fa] == 1) pc('0'); else pc('?'); } } } int main(){ solve(); return 0; } |
English