#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &a, const T &b) {
  return b < a ? a = b, 1 : 0;
}
template <typename T>
inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
const int oo = 0x3f3f3f3f;
const int maxn = 3010;
int n;
pair<int, int> a[maxn + 5];
struct data {
  int a, b, c;
  data() {}
  data(int _a, int _b, int _c) : a(_a), b(_b), c(_c) {}
  friend bool operator<(const data &first, const data &second) {
    if (first.a != second.a) return first.a > second.a;
    if (first.b != second.b) return first.b > second.b;
    return first.c > second.c;
  }
};
data dp[3][maxn + 5];
int pre[3][maxn + 5];
int out[maxn + 5];
data ans;
int ans0, ans1, ans2;
int w[maxn + 5];
int main() {
  scanf("%d", &n);
  for (int i = (0), i_end_ = (n); i < i_end_; ++i)
    scanf("%d", &a[i].first), a[i].second = i;
  sort(a, a + n);
  w[0] = a[0].first;
  for (int i = (1), i_end_ = (n); i < i_end_; ++i)
    w[i] = a[i].first - a[i - 1].first;
  ans = data(-oo, -oo, -oo);
  for (int l = 1; (l << 1) <= n; ++l) {
    for (int i = (0), i_end_ = (3); i < i_end_; ++i)
      for (int j = (0), j_end_ = (n); j < j_end_; ++j)
        dp[i][j] = data(-oo, -oo, -oo), pre[i][j] = -1;
    for (int i = (0), i_end_ = (n); i < i_end_; ++i)
      dp[0][i] = data(0, 0, w[i]);
    for (int i = (1), i_end_ = (3); i < i_end_; ++i) {
      deque<int> q;
      for (int j = (0), j_end_ = (n); j < j_end_; ++j) {
        while (!q.empty() && q.front() < j - (l << 1)) q.pop_front();
        if (j >= l && dp[i - 1][j - l].a >= 0) {
          while (!q.empty() && dp[i - 1][j - l] < dp[i - 1][q.back()])
            q.pop_back();
          q.push_back(j - l);
        }
        if (!q.empty()) {
          if (chkmin(dp[i][j], dp[i - 1][q.front()])) pre[i][j] = q.front();
        }
        if (dp[i][j].a >= 0) {
          if (i == 1)
            dp[i][j].b = w[j];
          else if (i == 2)
            dp[i][j].a = w[j];
        }
      }
    }
    for (int i = (n - (l << 1)), i_end_ = (n - l + 1); i < i_end_; ++i)
      if (chkmin(ans, dp[2][i])) {
        ans2 = i;
        ans1 = pre[2][i];
        ans0 = pre[1][ans1];
      }
  }
  memset(out, -1, sizeof out);
  for (int i = (ans2), i_end_ = (n); i < i_end_; ++i) out[a[i].second] = 1;
  for (int i = (ans1), i_end_ = (ans2); i < i_end_; ++i) out[a[i].second] = 2;
  for (int i = (ans0), i_end_ = (ans1); i < i_end_; ++i) out[a[i].second] = 3;
  for (int i = (0), i_end_ = (n); i < i_end_; ++i) printf("%d ", out[i]);
  printf("\n");
  return 0;
}
