#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
#pragma GCC optimize("no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int N = 2e5 + 100, OO = 1e9 + 7, K = 3e5 + 100, T = 5, M = 1e9 + 7,
          P = 6151, SQ = 450, lg = 20;
struct edge {
  int to, nxt, w;
} e[N << 2];
int edge_num = -1;
int head[N];
void add(int u, int v) {
  e[++edge_num].nxt = head[u];
  e[edge_num].to = v;
  head[u] = edge_num;
}
void add_edge(int u, int v) {
  add(u, v);
  add(v, u);
}
struct node {
  int l, r;
} q[N];
int in[N];
void dfs(int u) {
  for (int i = head[u]; i != -1; i = e[i].nxt) {
    head[u] = i;
    if (e[i].w == 0) {
      e[i].w = 1, e[i ^ 1].w = 2;
      dfs(e[i].to);
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  memset(head, -1, sizeof(head));
  int n;
  cin >> n;
  vector<int> v;
  for (int i = 1; i <= n; i++) {
    cin >> q[i].l >> q[i].r;
    q[i].r++;
    v.push_back(q[i].l);
    v.push_back(q[i].r);
  }
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  for (int i = 1; i <= n; i++) {
    q[i].l = lower_bound(v.begin(), v.end(), q[i].l) - v.begin() + 1;
    q[i].r = lower_bound(v.begin(), v.end(), q[i].r) - v.begin() + 1;
    add_edge(q[i].l, q[i].r);
    in[q[i].l]++;
    in[q[i].r]++;
  }
  vector<int> v1;
  for (int i = 1; i <= (int)v.size(); i++)
    if (in[i] % 2 == 1) v1.push_back(i);
  for (int i = 0; i < (int)v1.size(); i += 2) add_edge(v1[i], v1[i + 1]);
  for (int i = 1; i <= (int)v.size(); i++) dfs(i);
  for (int i = 0; i < 2 * n; i++) {
    if (e[i].w == 1) cout << i % 2 << " ";
  }
  return 0;
}
