#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;
}
int main(){
ci n=I(),m=I();
struct idk{
int a,b;
};
V <idk> rv(m);
REP(i, m)
rv[i]={I()-1, I()-1};
vi wyn(n+1),wynagr(n+1); // wynagr to ze ile prz dow. o dl i
vi v(n, 2);
F <void(int)> rek=[&](int akt){
// i to ind. następnego ruchu
C vi bkp=v;
while (akt<m){
C auto [a, b]=rv[akt];
++akt;
if (v[a]&v[b]&2){
v[a]=v[b]=0;
rek(akt);
v[a]=v[b]=1;
rek(akt);
goto fin;
}
// v[a] nie zero i v[b] nie 1.
if (v[a]*(v[b]^1))
std::swap(v[a], v[b]);
}
{
int p1=n,k1=-1,p0=-1,k0=n;
REP(i, n){
if (!v[i]){
if (p1<n)
k0=std::min(k0, i);
else
p0=i;
}
if (v[i]&1){
if (p1<n){
if (k0<n)
goto fin;
k1=i;
}
else
p1=k1=i;
}
}
if (p1<n)
FOR(i, 1, n){
ci minp=std::max(p0+1, k1-(i-1)),maxp=std::min(k0-i, p1);
wyn[i]^=std::max(0, maxp-minp+1)&1;
}
else{
int pop0=-1;
REP(i, n){
if (!v[i]){
wynagr[i-pop0-1]^=1;
pop0=i;
}
}
++wynagr[n-pop0-1];
}
}
fin:
v=bkp;
};
rek(0);
// wynagr handle
FOR(d, 1, n)
FOR(i, 1, d)
wyn[i]^=wynagr[d]&(d-i+1)&1;
FOR(i, 1, n){
assert(!wyn[i]||wyn[i]==1);
printf("%d ", wyn[i]);
}
printf("\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 107 108 109 110 111 | #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; } int main(){ ci n=I(),m=I(); struct idk{ int a,b; }; V <idk> rv(m); REP(i, m) rv[i]={I()-1, I()-1}; vi wyn(n+1),wynagr(n+1); // wynagr to ze ile prz dow. o dl i vi v(n, 2); F <void(int)> rek=[&](int akt){ // i to ind. następnego ruchu C vi bkp=v; while (akt<m){ C auto [a, b]=rv[akt]; ++akt; if (v[a]&v[b]&2){ v[a]=v[b]=0; rek(akt); v[a]=v[b]=1; rek(akt); goto fin; } // v[a] nie zero i v[b] nie 1. if (v[a]*(v[b]^1)) std::swap(v[a], v[b]); } { int p1=n,k1=-1,p0=-1,k0=n; REP(i, n){ if (!v[i]){ if (p1<n) k0=std::min(k0, i); else p0=i; } if (v[i]&1){ if (p1<n){ if (k0<n) goto fin; k1=i; } else p1=k1=i; } } if (p1<n) FOR(i, 1, n){ ci minp=std::max(p0+1, k1-(i-1)),maxp=std::min(k0-i, p1); wyn[i]^=std::max(0, maxp-minp+1)&1; } else{ int pop0=-1; REP(i, n){ if (!v[i]){ wynagr[i-pop0-1]^=1; pop0=i; } } ++wynagr[n-pop0-1]; } } fin: v=bkp; }; rek(0); // wynagr handle FOR(d, 1, n) FOR(i, 1, d) wyn[i]^=wynagr[d]&(d-i+1)&1; FOR(i, 1, n){ assert(!wyn[i]||wyn[i]==1); printf("%d ", wyn[i]); } printf("\n"); } |
English