#include <bits/stdc++.h>
using namespace std;
const double dInf = 1E90;
const long long lInf = (long long)1E16;
const int Inf = 0x23333333;
const int N = 300005;
struct edge {
  int x, y, used, num, next;
} e[N << 1];
int a[N];
int cnt[N], ret[N];
bool vis[N];
int n, m, T = 2;
pair<int, int> A[N];
void mke(int x, int y, int num) {
  e[T].y = y, e[T].next = a[x], e[T].num = num, a[x] = T++;
  e[T].y = x, e[T].next = a[y], e[T].num = num, a[y] = T++;
}
void preprocessing() {
  static pair<long long, int> que[N];
  int tl = 0;
  scanf("%d", &n);
  for (int i = 0, LIM = n; i < LIM; ++i) {
    scanf("%d%d", &A[i].first, &A[i].second);
    if (A[i].first > A[i].second) swap(A[i].first, A[i].second);
    que[tl++] = make_pair(A[i].first, i + 1),
    que[tl++] = make_pair(++A[i].second, -i - 1);
  }
  sort(que, que + tl);
  for (int i = 0, LIM = tl; i < LIM; ++i) {
    if (i && que[i].first != que[i - 1].first) ++m;
    if (que[i].second < 0)
      A[-que[i].second - 1].second = m;
    else
      A[que[i].second - 1].first = m;
  }
  for (int i = 0, LIM = n; i < LIM; ++i) {
    cnt[A[i].first] ^= 1, cnt[A[i].second] ^= 1;
    mke(A[i].first, A[i].second, i);
  }
  int pre = -1;
  for (int i = 0, LIM = m + 1; i < LIM; ++i) {
    if (!cnt[i]) continue;
    if (pre >= 0)
      mke(pre, i, -1), pre = -1;
    else
      pre = i;
  }
}
void euler(int x, int fr) {
  vis[x] = 1;
  for (int j = a[x]; j; j = e[j].next)
    if (j != (fr ^ 1) && !e[j].used)
      e[j].used = 1, e[j ^ 1].used = 2, euler(e[j].y, j);
}
int main() {
  preprocessing();
  for (int i = 0, LIM = m; i < LIM; ++i)
    if (!vis[i]) euler(i, N + 5);
  for (int i = 2, LIM = T; i < LIM; ++i) {
    if (e[i].num < 0) continue;
    ret[e[i].num] = (e[i].used == 1) ^ (i & 1);
  }
  for (int i = 0, LIM = n; i < LIM; ++i) printf("%d ", ret[i]);
  printf("\n");
  return 0;
}
