#include <bits/stdc++.h>
using namespace std;
template <typename Type>
void Get_Val(Type &Ret) {
  Ret = 0;
  char ch;
  while (ch = getchar(), ch > '9' || ch < '0')
    ;
  do {
    (Ret *= 10) += ch - '0';
  } while (ch = getchar(), ch >= '0' && ch <= '9');
}
const int Max_N(100050);
int N;
long long int A[Max_N], B[Max_N], D[Max_N];
long long int All, Base[61];
vector<int> G[61];
int choose[61], choose2[Max_N];
int Ans[61], Ans2[Max_N];
void insert(long long int v) {
  for (int b = 60; b >= 0; --b)
    if (v & (1LL << (b * 1LL)))
      if (Base[b])
        v ^= Base[b];
      else {
        Base[b] = v;
        break;
      }
}
void insert2(long long int v, const int &pos) {
  memset(choose, 0, sizeof(choose));
  for (int b = 60; b >= 0; --b)
    if (v & (1LL << (b * 1LL)))
      if (Base[b])
        v ^= Base[b], choose[b] = 1;
      else {
        Base[b] = v;
        memset(choose2, 0, sizeof(choose2));
        choose2[pos] = 1;
        for (int bb = 60; bb >= b + 1; --bb)
          if (choose[bb])
            for (int i = 0; i != G[bb].size(); ++i) choose2[G[bb][i]] ^= 1;
        for (int i = 1; i <= N; ++i)
          if (choose2[i]) G[b].push_back(i);
        break;
      }
}
void init() {
  Get_Val(N);
  for (int i = 1; i <= N; ++i)
    Get_Val(A[i]), All ^= A[i], insert(A[i]), D[i] = B[i] = A[i];
}
void del(const int &b) {
  for (int bb = 60; bb >= 0; --bb) Base[bb] = 0LL;
  for (int i = 1; i <= N; ++i) {
    if (A[i] & (1LL << (b * 1LL))) A[i] -= (1LL << (b * 1LL));
    insert(A[i]);
  }
}
int C[61];
bool ok() {
  long long int T(0LL);
  for (int b = 60; b >= 0; --b)
    if (C[b] != -1 && ((T & (1LL << (b * 1LL))) != 0LL) != C[b])
      if (Base[b])
        T ^= Base[b];
      else
        return false;
  return true;
}
void work() {
  memset(C, -1, sizeof(C));
  long long int T(0LL);
  for (int b = 60; b >= 0; --b)
    if (All & (1LL << (b * 1LL)))
      del(b);
    else {
      C[b] = 1;
      if (ok())
        T += (1LL << (b * 1LL));
      else
        del(b), C[b] = -1;
    }
  for (int b = 60; b >= 0; --b)
    if ((All & (1LL << (b * 1LL))) == 0LL && C[b] == -1)
      for (int i = 1; i <= N; ++i)
        if (B[i] & (1LL << (b * 1LL))) B[i] -= (1LL << (b * 1LL));
  for (int b = 60; b >= 0; --b)
    if (All & (1LL << (b * 1LL))) {
      for (int i = 1; i <= N; ++i) A[i] = B[i];
      for (int bb = 60; bb >= 0; --bb) Base[bb] = 0LL;
      for (int bb = b - 1; bb >= 0; --bb)
        if (All & (1LL << (bb * 1LL)))
          for (int i = 1; i <= N; ++i)
            if (A[i] & (1LL << (bb * 1LL))) A[i] -= (1LL << (bb * 1LL));
      for (int i = 1; i <= N; ++i) insert(A[i]);
      C[b] = 0;
      if (ok())
        ;
      else {
        T += (1LL << (b * 1LL)), C[b] = -1;
        for (int i = 1; i <= N; ++i)
          if (B[i] & (1LL << (b * 1LL))) B[i] -= (1LL << (b * 1LL));
      }
    }
  for (int bb = 60; bb >= 0; --bb) Base[bb] = 0LL, G[bb].clear();
  for (int i = 1; i <= N; ++i) insert2(D[i], i);
  for (int b = 60; b >= 0; --b)
    if (T & (1LL << (b * 1LL))) Ans[b] = 1, T ^= Base[b];
  for (int i = 1; i <= N; ++i) Ans2[i] = 1;
  for (int b = 60; b >= 0; --b)
    if (Ans[b])
      for (int i = 0; i != G[b].size(); ++i) Ans2[G[b][i]] ^= 1;
  for (int i = 1; i <= N; ++i) printf("%d ", Ans2[i] + 1);
}
int main() {
  init();
  work();
  return 0;
}
