#include <bits/stdc++.h>
using namespace std;
const int maxn = 3100;
int f[maxn];
int g[maxn][maxn];
int w[maxn][maxn];
struct num {
  int v, id;
} a[maxn];
int res[maxn];
struct node {
  int x, y, z;
  node() {}
  node(int x, int y, int z) : x(x), y(y), z(z) {}
};
bool cmp(const node& a, const node& b) {
  if (a.x != b.x) return a.x > b.x;
  if (a.y != b.y) return a.y > b.y;
  return a.z > b.z;
}
bool com(const num& a, const num& b) { return a.v > b.v; }
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i].v);
    a[i].id = i;
  }
  sort(a + 1, a + n + 1, com);
  a[n + 1].v = 0;
  for (int i = 0; i < n; i++) f[i] = a[n - i].v - a[n - i + 1].v;
  for (int i = 0; i < n; i++) {
    g[i][i] = f[i];
    w[i][i] = i;
    for (int j = i + 1; j < n; j++) {
      if (f[j] > g[i][j - 1]) {
        g[i][j] = f[j];
        w[i][j] = j;
      } else {
        g[i][j] = g[i][j - 1];
        w[i][j] = w[i][j - 1];
      }
    }
  }
  node ans = node(-1, -1, -1);
  node tt;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (2 * i < j || 2 * j < i) continue;
      int ax = (i + 1) / 2;
      int ay = i * 2;
      int bx = (j + 1) / 2;
      int by = j * 2;
      int x = max(ax, bx);
      int y = min(ay, by);
      x = max(x, 1);
      y = min(y, n - i - j);
      if (x > y) continue;
      x = n - i - j - x;
      y = n - i - j - y;
      node tmp =
          node(a[i].v - a[i + 1].v, a[i + j].v - a[i + j + 1].v, g[y][x]);
      if (cmp(tmp, ans)) {
        ans = tmp;
        tt = node(i, j, n - i - j - w[y][x]);
      }
    }
  for (int i = 1; i <= tt.x; i++) res[a[i].id] = 1;
  for (int i = tt.x + 1; i <= tt.x + tt.y; i++) res[a[i].id] = 2;
  for (int i = tt.x + tt.y + 1; i <= tt.x + tt.y + tt.z; i++) res[a[i].id] = 3;
  for (int i = tt.x + tt.y + tt.z + 1; i <= n; i++) res[a[i].id] = -1;
  for (int i = 1; i <= n; i++) {
    printf("%d", res[i]);
    if (i == n)
      printf("\n ");
    else
      printf(" ");
  }
}
