#include <bits/stdc++.h>
using namespace std;
template <typename T>
bool chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
bool chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
const int maxn = 2e5 + 1e2;
struct node {
  int l, r;
} s[maxn];
struct Edge {
  int to, nxt, id;
} e[maxn << 1];
int n;
int tot, Cnt = 1;
int b[maxn << 1], head[maxn], cnt[maxn], Ans[maxn], vis[maxn], Vis[maxn << 1];
vector<int> S;
inline void file() {
  freopen("CF429E.in", "r", stdin);
  freopen("CF429E.out", "w", stdout);
}
inline int read() {
  int x = 0, p = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') p = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c - '0');
    c = getchar();
  }
  return x * p;
}
inline void add(int from, int to, int p) {
  e[++Cnt] = (Edge){to, head[from], p};
  head[from] = Cnt;
  e[++Cnt] = (Edge){from, head[to], p};
  head[to] = Cnt;
}
void dfs(int u) {
  vis[u] = 1;
  for (int i = head[u]; i != 0; i = e[i].nxt)
    if (!Vis[i / 2]) {
      Vis[i / 2] = 1;
      if (i & 1)
        Ans[e[i].id] = 1;
      else
        Ans[e[i].id] = 0;
      dfs(e[i].to);
    }
}
int main() {
  n = read();
  for (int i = (int)1; i <= (int)n; ++i) {
    s[i].l = read();
    s[i].r = read();
    ++s[i].r;
    b[++tot] = s[i].l;
    b[++tot] = s[i].r;
  }
  sort(b + 1, b + tot + 1);
  tot = unique(b + 1, b + tot + 1) - (b + 1);
  for (int i = (int)1; i <= (int)n; ++i) {
    int x = lower_bound(b + 1, b + tot + 1, s[i].l) - b;
    int y = lower_bound(b + 1, b + tot + 1, s[i].r) - b;
    add(x, y, i);
    ++cnt[x];
    ++cnt[y];
  }
  for (int i = (int)1; i <= (int)tot; ++i)
    if (cnt[i] & 1) S.push_back(i);
  for (int i = 0; i < (int)S.size() - 1; i += 2) add(S[i], S[i + 1], 0);
  for (int i = (int)1; i <= (int)tot; ++i)
    if (!vis[i]) dfs(i);
  for (int i = (int)1; i <= (int)n; ++i) printf("%d ", Ans[i]);
  return 0;
}
