#include <bits/stdc++.h>
#pragma GCC optimize("O2,Ofast,inline,unroll-all-loops,-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
using namespace std;
struct data {
  int x, id;
  bool operator<(const data &rhs) const { return x < rhs.x; }
} ds[200010];
int val[200010], lef[200010], righ[200010], n;
bool vis[200010];
vector<int> nxt[200010];
map<pair<int, int>, int> ban, ans;
template <class T>
void read(T &x) {
  char ch = x = 0;
  bool fl = false;
  while (!isdigit(ch)) fl |= ch == '-', ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  x = fl ? -x : x;
}
void dfs(int u) {
  for (auto &v : nxt[u]) {
    if (!ban[{u, v}]) {
      ban[{u, v}] = ban[{v, u}] = true;
      ans[{u, v}] = 1, dfs(v);
    }
  }
}
int main() {
  read(n);
  for (int i = 1; i <= n; i++) {
    read(ds[i].x), read(ds[n + i].x), ds[n + i].x++;
    ds[i].id = i, ds[n + i].id = n + i;
  }
  sort(ds + 1, ds + 2 * n + 1), ds[0].x = -1;
  for (int i = 1; i <= 2 * n; i++) {
    val[ds[i].id] = val[ds[i - 1].id] + (ds[i].id != ds[i - 1].id);
    (ds[i].id <= n ? lef[ds[i].id] : righ[ds[i].id - n]) = val[ds[i].id];
  }
  for (int i = 1; i <= n; i++) {
    nxt[lef[i]].push_back(righ[i]), nxt[righ[i]].push_back(lef[i]);
  }
  for (int i = 1, last = 0; i <= val[ds[2 * n].id]; i++) {
    if (nxt[i].size() & 1) {
      if (last)
        nxt[last].push_back(i), nxt[i].push_back(last), last = 0;
      else
        last = i;
    }
  }
  for (int i = 1; i <= 2 * n; i++) {
    if (!vis[i]) dfs(i);
  }
  for (int i = 1; i <= n; i++) {
    printf("%d%c", ans[{lef[i], righ[i]}], i == n ? '\n' : ' ');
  }
  return 0;
}
