#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int M = 5005;
int read() {
  int x = 0, y = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') y = (ch == '-' ? -1 : 1), ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * y;
}
struct Stu {
  int id, val;
} s[M];
int n, Ans[M];
bool cmp(Stu x, Stu y) { return x.val > y.val; }
void solve_fake() {
  n = read();
  for (int i = 1; i <= n; i++) s[i].val = read(), s[i].id = i;
  sort(s + 1, s + n + 1, cmp);
  s[n + 1].val = 0;
  int Max = -1, x, St, xzl = 1, xzr = n / 2, sz1, sz2, sz3;
  for (int i = xzl; i <= xzr; i++)
    if (s[i].val - s[i + 1].val > Max) Max = s[i].val - s[i + 1].val, x = i;
  for (int i = 1; i <= x; i++) Ans[s[i].id] = 1;
  sz1 = x;
  St = x + 1;
  xzl = max((sz1 + 1) / 2, 1), xzr = 0;
  for (int i = 1; i <= n; i++) {
    if ((3 * i + 1) / 2 > n - sz1) break;
    xzr = i;
  }
  xzr = min(xzr, sz1 * 2);
  Max = -1;
  for (int i = St + xzl - 1; i <= St + xzr - 1; i++)
    if (s[i].val - s[i + 1].val > Max) Max = s[i].val - s[i + 1].val, x = i;
  for (int i = St; i <= x; i++) Ans[s[i].id] = 2;
  sz2 = x - St + 1;
  St = x + 1;
  xzl = max(max((sz1 + 1) / 2, (sz2 + 1) / 2), 1);
  Max = -1;
  for (int i = St + xzl - 1; i <= n; i++)
    if (s[i].val - s[i + 1].val > Max) Max = s[i].val - s[i + 1].val, x = i;
  for (int i = St; i <= x; i++) Ans[s[i].id] = 3;
  for (int i = x + 1; i <= n; i++) Ans[s[i].id] = -1;
  for (int i = 1; i <= n; i++) printf("%d ", Ans[i]);
  printf("\n");
}
int nowa = 1, nowb = 2, nowc = 3;
void solve() {
  n = read();
  for (int i = 1; i <= n; i++) s[i].val = read(), s[i].id = i;
  sort(s + 1, s + n + 1, cmp);
  s[n + 1].val = 0;
  for (int i = 1; i <= n / 2; i++) {
    int lj = i + (i + 1) / 2, rj = min(i * 3, n - (i + 1) / 2);
    for (int j = lj; j <= rj; j++) {
      int lk = j + max((i + 1) / 2, (j - i + 1) / 2),
          rk = min(j + min(i * 2, (j - i) * 2), n);
      for (int k = lk; k <= rk; k++) {
        int va = s[i].val - s[i + 1].val;
        int vb = s[j].val - s[j + 1].val;
        int vc = s[k].val - s[k + 1].val;
        int Ansa = s[nowa].val - s[nowa + 1].val;
        int Ansb = s[nowb].val - s[nowb + 1].val;
        int Ansc = s[nowc].val - s[nowc + 1].val;
        if (va > Ansa ||
            (va == Ansa && (vb > Ansb || (vb == Ansb && vc > Ansc))))
          nowa = i, nowb = j, nowc = k;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (i <= nowa)
      Ans[s[i].id] = 1;
    else if (i <= nowb)
      Ans[s[i].id] = 2;
    else if (i <= nowc)
      Ans[s[i].id] = 3;
    else
      Ans[s[i].id] = -1;
  }
  for (int i = 1; i <= n; i++) printf("%d ", Ans[i]);
  printf("\n");
}
signed main() { solve(); }
