#include <bits/stdc++.h>
using namespace std;
string itosm(long long x) {
  if (x == 0) return "0";
  string ans = "";
  while (x > 0) {
    ans += ((x % 10) + '0');
    x /= 10;
  }
  reverse(ans.begin(), ans.end());
  return ans;
}
long long stoim(string str) {
  long long ans = 0;
  long long k = 1;
  for (int i = str.length() - 1; i >= 0; i--) {
    ans += (str[i] - '0') * k;
    k *= 10;
  }
  return ans;
}
const long long infll = 1e18 + 3;
const int inf = 1009000999;
const double eps = 1e-7;
const int maxn = 1e6 + 777;
const int baseint = 1000200013;
const long long basell = 1e18 + 3;
const long double PI = acos(-1.0);
const long long mod = 1e9 + 7;
pair<short, short> a[6777];
pair<short, short> t[3777][12777];
int xx;
int ans[3777];
pair<short, short> maxM(pair<short, short> a, pair<short, short> b) {
  if (a.first >= b.first) return a;
  return b;
}
void build(int v, int l, int r) {
  if (l == r) {
    t[xx][v].first = a[xx + l].first - a[xx + l + 1].first;
    t[xx][v].second = l;
    return;
  }
  int c = (l + r) / 2;
  build(v * 2, l, c);
  build(v * 2 + 1, c + 1, r);
  t[xx][v] = maxM(t[xx][v * 2], t[xx][v * 2 + 1]);
}
pair<short, short> getMax(int v, int tl, int tr, int l, int r) {
  if (l > r) return {-1, -1};
  if (tl == l && tr == r) return t[xx][v];
  int c = (tl + tr) / 2;
  return maxM(getMax(v * 2, tl, c, l, min(c, r)),
              getMax(v * 2 + 1, c + 1, tr, max(c + 1, l), r));
}
void solve() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i].first;
    a[i].second = i;
  }
  sort(a, a + n);
  reverse(a, a + n);
  for (int i = 0; i < n; i++) {
    xx = i;
    build(1, 0, n);
  }
  int f1 = -1, f2 = -1, f3 = -1, ff1, ff2, ff3, i, j, f, q1, q2, q3;
  for (i = 1; i <= n / 2; i++) {
    f = 0;
    f = (a[i - 1].first - a[i].first);
    ff1 = f;
    if (f < f1) continue;
    for (j = 1; j <= i * 2; j++) {
      if (j * 2 < i) continue;
      if (i + j + max((i + 1) / 2, (j + 1) / 2) > n) continue;
      f = (a[i + j - 1].first - a[i + j].first);
      ff2 = f;
      if (f < f2 && f1 == ff1) continue;
      xx = i + j;
      pair<short, short> x = getMax(1, 0, n, max((i + 1) / 2, (j + 1) / 2) - 1,
                                    min(min(i * 2, j * 2), n - i - j) - 1);
      x.second++;
      if (f1 == ff1 && ff2 == f2 && x.first <= f3) continue;
      f1 = ff1;
      f2 = ff2;
      f3 = x.first;
      q1 = i;
      q2 = j;
      q3 = x.second;
    }
  }
  f1 = q1, f2 = q2, f3 = q3;
  for (int i = 0; i < f1; i++) ans[a[i].second] = 1;
  for (int i = f1; i < f1 + f2; i++) ans[a[i].second] = 2;
  for (int i = f1 + f2; i < f1 + f2 + f3; i++) {
    ans[a[i].second] = 3;
  }
  for (int i = f1 + f2 + f3; i < n; i++) ans[a[i].second] = -1;
  for (int i = 0; i < n; i++) {
    cout << ans[i] << " ";
  }
}
int main() {
  srand(time(0));
  ios_base::sync_with_stdio(0);
  ;
  solve();
  return 0;
}
