#include <bits/stdc++.h>
using namespace std;
namespace Solve {
const int MAXN = 3005;
inline int mymin(int a, int b) { return a < b ? a : b; }
inline int mymax(int a, int b) { return a > b ? a : b; }
int Log[MAXN], maxid[MAXN][20];
void getLog() {
  Log[1] = 0;
  for (int i = 2; i <= 3000; i++) {
    if (i & 1)
      Log[i] = Log[i - 1];
    else
      Log[i] = Log[i >> 1] + 1;
  }
  return;
}
void getST(int *A, int n) {
  for (int i = 1; i <= n; i++) maxid[i][0] = i;
  for (int k = 1; k <= 12; k++) {
    for (int i = 1; i + (1 << k) - 1 <= n; i++) {
      int f = i + (1 << (k - 1));
      if (A[maxid[i][k - 1]] > A[maxid[f][k - 1]])
        maxid[i][k] = maxid[i][k - 1];
      else
        maxid[i][k] = maxid[f][k - 1];
    }
  }
  return;
}
struct Data {
  int id, val;
  Data(int a = 0, int b = 0) : id(a), val(b) {}
  bool operator<(const Data &B) const { return val > B.val; }
} A[MAXN];
int N, D[MAXN], awd[MAXN];
int Qmaxid(int l, int r) {
  if (l > r) return 0;
  int k = Log[r - l + 1];
  int f = r - (1 << k) + 1;
  if (D[maxid[l][k]] > D[maxid[f][k]]) return maxid[l][k];
  return maxid[f][k];
}
void work() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) scanf("%d", &A[i].val), A[i].id = i;
  sort(A + 1, A + N + 1);
  A[0].val = 0;
  for (int i = 1; i <= N; i++) D[i] = A[i - 1].val - A[i].val;
  D[N + 1] = A[N].val;
  getLog();
  getST(D, N + 1);
  int mxi = -1, mxj = -1, mxk = -1, ansi = -1, ansj = -1, ansk = -1;
  for (int i = 1; i < N; i++) {
    if (A[i].val - A[i + 1].val < mxi) continue;
    for (int j = i + 1; j < N; j++) {
      if (i > 2 * (j - i)) continue;
      if (j - i > 2 * i) break;
      if (A[i].val - A[i + 1].val == mxi && A[j].val - A[j + 1].val < mxj)
        continue;
      int milen = mymin(i, j - i);
      int mxlen = mymax(i, j - i);
      int low = j + ((mxlen + 1) >> 1) + 1, upp = j + (milen << 1) + 1;
      if (low > N + 1) continue;
      if (upp > N + 1) upp = N + 1;
      int mxid = Qmaxid(low, upp);
      if (A[i].val - A[i + 1].val == mxi && A[j].val - A[j + 1].val == mxj &&
          D[mxid] < mxk)
        continue;
      mxi = A[i].val - A[i + 1].val;
      mxj = A[j].val - A[j + 1].val;
      mxk = D[mxid];
      ansi = i, ansj = j, ansk = mxid - 1;
    }
  }
  for (int i = 1; i <= ansi; i++) awd[A[i].id] = 1;
  for (int i = ansi + 1; i <= ansj; i++) awd[A[i].id] = 2;
  for (int i = ansj + 1; i <= ansk; i++) awd[A[i].id] = 3;
  for (int i = ansk + 1; i <= N; i++) awd[A[i].id] = -1;
  for (int i = 1; i <= N; i++) printf("%d ", awd[i]);
  printf("\n");
  return;
}
}  // namespace Solve
int main() {
  Solve::work();
  return 0;
}
