#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3005;
using pss = pair<short, short>;
using A34 = array<int, 3>;
ostream &operator<<(ostream &s, const A34 &p) {
  return s << "(" << p[0] << "," << p[1] << "," << p[2] << ")";
}
int N, d[MAXN], degree[MAXN];
pss ip[MAXN];
pss rmq[MAXN][MAXN];
A34 slow() {
  A34 res = {-1, -1, -1};
  A34 qqq = {0, 0, 0};
  for (int i = (0); i <= (N); i++) {
    for (int j = (i + 1); j <= (N); j++) {
      for (int k = (j + 1); k <= (N - 1); k++) {
        int a[3] = {j - i, k - j, N - k};
        int fail = 0;
        for (int x = 0; x < (3); x++)
          for (int y = 0; y < (3); y++)
            if (a[x] > a[y] * 2) fail = 1;
        if (fail) continue;
        A34 tmp = {d[k], d[j], d[i]};
        if (tmp > res) {
          res = tmp;
          qqq = {i, j, k};
        }
      }
    }
  };
  return res;
}
void build_rmq() {
  for (int i = (0); i <= (N); i++) {
    rmq[i][i] = {d[i], i};
    for (int j = (i + 1); j <= (N); j++) {
      rmq[i][j] = rmq[i][j - 1];
      if (d[j] > rmq[i][j].first) {
        rmq[i][j] = {d[j], j};
      }
    }
  }
}
pss query(int l, int r) {
  l = max(l, 0);
  r = max(r, 0);
  return rmq[l][r];
  int bi = l;
  int bd = d[bi];
  for (int i = (l); i <= (r); i++) {
    if (d[i] > bd) {
      bi = i;
      bd = d[i];
    }
  }
  assert(bd == rmq[l][r].first);
  return pss(bd, bi);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  ;
  cin >> N;
  for (int i = (1); i <= (N); i++) {
    cin >> ip[i].first;
    ip[i].second = i;
  }
  sort(ip + 1, ip + 1 + N);
  d[0] = ip[1].first;
  for (int i = (1); i <= (N - 1); i++) {
    d[i] = ip[i + 1].first - ip[i].first;
  }
  build_rmq();
  for (int i = (1); i <= (N); i++) cerr << ip[i].first << " ";
  cerr << endl;
  A34 bval = {-1, -1, -1};
  A34 bid = {0, 0, 0};
  for (int i = (1); i <= (N - 1); i++) {
    for (int j = (i + 1); j <= (N - 1); j++) {
      A34 val = {d[j], d[i], 0};
      int z1 = j - i;
      int z2 = N - j;
      if (z1 > z2 * 2) continue;
      if (z2 > z1 * 2) continue;
      int z = min(z1, z2);
      if (i >= z) {
        ;
        pss res = query(i - 2 * z, i - z);
        val[2] = res.first;
        if (val > bval) {
          bval = val;
          bid = {res.second, i, j};
        }
      }
      int q = max(z1, z2);
      z = (q + 1) / 2;
      ;
      if (i >= z and min(z1, z2) > z) {
        ;
        pss res = query(i - q, i - z);
        val[2] = res.first;
        if (val > bval) {
          bval = val;
          bid = {res.second, i, j};
        }
      }
    }
  };
  ;
  for (int i = (1); i <= (bid[0]); i++) degree[ip[i].second] = -1;
  for (int i = (bid[0] + 1); i <= (bid[1]); i++) degree[ip[i].second] = 3;
  for (int i = (bid[1] + 1); i <= (bid[2]); i++) degree[ip[i].second] = 2;
  for (int i = (bid[2] + 1); i <= (N); i++) degree[ip[i].second] = 1;
  int a[3];
  a[0] = bid[1] - bid[0];
  a[1] = bid[2] - bid[1];
  a[2] = N - bid[2];
  for (int i = 0; i < (3); i++)
    for (int j = 0; j < (3); j++) assert(a[i] <= 2 * a[j]);
  assert(a[0] > 0);
  assert(a[1] > 0);
  assert(a[2] > 0);
  for (int i = (1); i <= (N); i++) cout << degree[i] << " \n"[i == N];
  return 0;
}
