#include <ios> #include <functional> #include <cassert> #include <vector> #define REP(i, n) for(int i=0; i<(n); ++i) #define SREP(n) REP(_ ## n, n) #define FOR(i, p, n) for(int i=(p); i<=(n); ++i) #define RFOR(i, p, n) for(int i=(p); i>=(n); --i) #define pb push_back #define eb emplace_back #define C const #define V std::vector #define F std::function #define R std::ranges #define RV std::ranges::views #define sz(A) int(A.size()) #define all(A) A.begin(), A.end() #define rall(A) A.rbegin(), A.rend() typedef long long ll; typedef long double ld; typedef V <int> vi; typedef V <vi> vvi; typedef V <bool> vb; typedef V <char> vc; typedef V <ll> vll; typedef const int ci; typedef const ll cll; int I(){ int z; while ((z=getchar_unlocked())<'0'||z>'9'); int r=z-'0'; while ((z=getchar_unlocked())>='0'&&z<='9') r=r*10+z-'0'; return r; } struct stt{ int g,r,s; // grupa, rozmiar, stan }; struct FUt{ V <stt> t; int akt; FUt(ci n){ akt=n<<1; t.resize(akt); REP(i, n){ t[i].g=i+n; t[i+n]={i+n, 1, 0}; } } int znaj(ci i){ if (t[i].g!=i) t[i].g=znaj(t[i].g); return t[i].g; } stt daj(ci i){ return t[znaj(i)]; } void wydziel(ci i){ t.eb(akt, 1, 0); --t[znaj(i)].r; t[i].g=akt; ++akt; } void lacz(int i, int j){ i=znaj(i),j=znaj(j); if (t[i].r>t[j].r) std::swap(i, j); if (i==j){ assert(!t[i].s); t[i].s=1; } else{ t[i].g=j; t[j].r+=t[i].r; t[j].s|=t[i].s; } } }; int main(){ ci n=I(),q=I(); FUt fu(n); SREP(q){ char z; scanf("\n%c ", &z); if (z=='?'){ stt s=fu.daj(I()-1); assert(s.r>=1); if (s.s) putchar_unlocked('1'); else if (s.r<=1) putchar_unlocked('0'); else putchar_unlocked('?'); } else if (z=='-') fu.wydziel(I()-1); else fu.lacz(I()-1, I()-1); } putchar_unlocked('\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 | #include <ios> #include <functional> #include <cassert> #include <vector> #define REP(i, n) for(int i=0; i<(n); ++i) #define SREP(n) REP(_ ## n, n) #define FOR(i, p, n) for(int i=(p); i<=(n); ++i) #define RFOR(i, p, n) for(int i=(p); i>=(n); --i) #define pb push_back #define eb emplace_back #define C const #define V std::vector #define F std::function #define R std::ranges #define RV std::ranges::views #define sz(A) int(A.size()) #define all(A) A.begin(), A.end() #define rall(A) A.rbegin(), A.rend() typedef long long ll; typedef long double ld; typedef V <int> vi; typedef V <vi> vvi; typedef V <bool> vb; typedef V <char> vc; typedef V <ll> vll; typedef const int ci; typedef const ll cll; int I(){ int z; while ((z=getchar_unlocked())<'0'||z>'9'); int r=z-'0'; while ((z=getchar_unlocked())>='0'&&z<='9') r=r*10+z-'0'; return r; } struct stt{ int g,r,s; // grupa, rozmiar, stan }; struct FUt{ V <stt> t; int akt; FUt(ci n){ akt=n<<1; t.resize(akt); REP(i, n){ t[i].g=i+n; t[i+n]={i+n, 1, 0}; } } int znaj(ci i){ if (t[i].g!=i) t[i].g=znaj(t[i].g); return t[i].g; } stt daj(ci i){ return t[znaj(i)]; } void wydziel(ci i){ t.eb(akt, 1, 0); --t[znaj(i)].r; t[i].g=akt; ++akt; } void lacz(int i, int j){ i=znaj(i),j=znaj(j); if (t[i].r>t[j].r) std::swap(i, j); if (i==j){ assert(!t[i].s); t[i].s=1; } else{ t[i].g=j; t[j].r+=t[i].r; t[j].s|=t[i].s; } } }; int main(){ ci n=I(),q=I(); FUt fu(n); SREP(q){ char z; scanf("\n%c ", &z); if (z=='?'){ stt s=fu.daj(I()-1); assert(s.r>=1); if (s.s) putchar_unlocked('1'); else if (s.r<=1) putchar_unlocked('0'); else putchar_unlocked('?'); } else if (z=='-') fu.wydziel(I()-1); else fu.lacz(I()-1, I()-1); } putchar_unlocked('\n'); } |