#include <bits/stdc++.h>
using namespace std;
struct inter {
  int l, r;
} I[600050];
struct point {
  int next, to, w;
} ar[600050];
bool is[600050];
int a[600050], at, head[600050], art(1);
inline int lower(int, int, int, int*);
inline void read(int&), link(int, int, int), dfs(int);
int main() {
  int n;
  read(n);
  for (int i(1); i <= n; ++i)
    read(I[i].l), read(I[i].r), a[++at] = I[i].l, a[++at] = ++I[i].r;
  sort(a + 1, a + at + 1), at = unique(a + 1, a + at + 1) - a - 1;
  for (int i(1); i <= n; ++i)
    link(I[i].l = lower(1, at, I[i].l, a), I[i].r = lower(1, at, I[i].r, a), i);
  memset(a, 0, sizeof(a));
  for (int i(1); i <= n; ++i) ++a[I[i].l], --a[I[i].r];
  for (int i(1); i <= at; ++i) a[i] += a[i - 1];
  for (int i(1); i <= at; ++i)
    if (a[i] & 1) link(i, i + 1, 0);
  for (int i(1); i <= at; ++i) dfs(i);
  for (int i(1); i <= n; ++i) printf("%d ", a[i]);
  return 0;
}
inline void dfs(int x) {
  for (int i(head[x]); i; i = ar[i].next)
    if (head[x] = ar[i].next, !is[i])
      a[ar[i].w] = x < ar[i].to, is[i ^ 1] = 1, dfs(ar[i].to);
}
inline void link(int u, int v, int w) {
  ar[++art] = {head[u], v, w}, head[u] = art;
  ar[++art] = {head[v], u, w}, head[v] = art;
}
inline int lower(int l, int r, int x, int* a) {
  int mid;
  while (mid = l + r >> 1, l <= r) a[mid] < x ? l = mid + 1 : r = mid - 1;
  return l;
}
inline void read(int& x) {
  x ^= x;
  register char c;
  while (c = getchar(), c < '0' || c > '9')
    ;
  while (c >= '0' && c <= '9')
    x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
}
