#include <bits/stdc++.h>
using namespace std;
const int N = 2e4;
pair<int, int> DO[N];
void add(int root, int l, int r, int val, int pos) {
  if (l > pos || r < pos) return;
  DO[root] = max(DO[root], {val, pos});
  if (l == r) return;
  add(root * 2, l, (l + r) / 2, val, pos),
      add(root * 2 + 1, (l + r) / 2 + 1, r, val, pos);
}
pair<int, int> getans(int root, int l, int r, int l1, int r1) {
  if (l > r1 || l1 > r) return {0, 0};
  if (l1 <= l && r <= r1) return DO[root];
  return max(getans(root * 2, l, (l + r) / 2, l1, r1),
             getans(root * 2 + 1, (l + r) / 2 + 1, r, l1, r1));
}
signed main() {
  int n;
  cin >> n;
  vector<pair<int, int>> v(n + 1);
  v[0] = {1e9, 1e9};
  for (int i = 1; i <= n; i++) {
    int a;
    cin >> a;
    v[i] = {a, i};
  }
  sort(v.begin(), v.end());
  reverse(v.begin(), v.end());
  for (int i = 1; i < n; i++) add(1, 1, n, v[i].first - v[i + 1].first, i);
  v.push_back(v.back());
  pair<int, pair<int, int>> maxs = {-1, {0, 0}};
  add(1, 1, n, v.back().first, n);
  int a1 = 0, b1 = 0, c1 = 0;
  for (int a = 1; a <= n; a++) {
    for (int b = 1; b <= n; b++) {
      if (a * 2 < b || b * 2 < a || a + b >= n) continue;
      int l = max(a / 2 + a % 2, b / 2 + b % 2);
      int r = min(a * 2, min(b * 2, n - a - b));
      if (r < l) continue;
      l += a + b, r += a + b;
      pair<int, int> c = getans(1, 1, n, l, r);
      pair<int, pair<int, int>> kekw = {
          v[a].first - v[a + 1].first,
          {v[a + b].first - v[a + b + 1].first, c.first}};
      if (kekw >= maxs) a1 = a, b1 = b, c1 = c.second - a - b, maxs = kekw;
    }
  }
  vector<int> ans(n + 1, -1);
  for (int i = 1; i <= n; i++) {
    if (i <= a1) {
      ans[v[i].second] = 1;
      continue;
    }
    if (i <= b1 + a1) {
      ans[v[i].second] = 2;
      continue;
    }
    if (i <= c1 + b1 + a1) {
      ans[v[i].second] = 3;
      continue;
    }
  }
  for (int i = 1; i <= n; i++) cout << ans[i] << " ";
}
