#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 3005;
const int MOD = 1000000007;
const double eps = 1e-8;
const double PI = acos(-1.0);
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long qpow(long long a, long long n, long long p = MOD) {
  long long r = 1 % p;
  for (a %= p; n; a = a * a % p, n >>= 1)
    if (n & 1) r = r * a % p;
  return r;
}
long long inv(long long x, long long p = MOD) {
  return x <= 1 ? 1 : inv(p % x, p) * (p - p / x) % p;
}
struct node {
  int val, id;
} a[3005];
int da[3005];
bool cmpa(node a, node b) { return a.val > b.val; }
bool cmpb(node a, node b) { return a.id < b.id; }
struct RMQ {
  int f[MAXN][21], pos[MAXN][21];
  int n;
  void init(int a[], int sz) {
    n = sz;
    for (int i = 0; i < n; i++) {
      f[i][0] = a[i];
      pos[i][0] = i;
    }
    for (int j = 1; (1 << j) <= n; j++) {
      for (int i = 0; i + (1 << j) - 1 < n; i++) {
        if (f[i][j - 1] < f[i + (1 << (j - 1))][j - 1]) {
          f[i][j] = f[i + (1 << (j - 1))][j - 1];
          pos[i][j] = pos[i + (1 << (j - 1))][j - 1];
        } else {
          f[i][j] = f[i][j - 1];
          pos[i][j] = pos[i][j - 1];
        }
      }
    }
  }
  int query(int l, int r) {
    int k = 0;
    while ((1 << (k + 1)) <= r - l + 1) {
      k++;
    }
    return f[l][k] >= f[r - (1 << k) + 1][k] ? pos[l][k]
                                             : pos[r - (1 << k) + 1][k];
  }
} myRMQ;
int ans[4];
inline void update(int i, int j, int k) { ans[1] = i, ans[2] = j, ans[3] = k; }
inline bool check(int i, int j, int k) {
  if (da[i] > da[ans[1]]) {
    return 1;
  } else if (da[i] == da[ans[1]]) {
    if (da[j] > da[ans[2]]) {
      return 1;
    } else if (da[j] == da[ans[2]] && da[k] > da[ans[3]]) {
      return 1;
    }
  }
  return 0;
}
int main(int argc, char* argv[]) {
  int n;
  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, cmpa);
  for (int i = 1; i <= n; i++) {
    da[i] = a[i].val - a[i + 1].val;
  }
  myRMQ.init(da, n + 1);
  for (int i = 1; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      int cnt[4];
      cnt[1] = i, cnt[2] = j - i;
      if (cnt[1] > 2 * cnt[2] || cnt[2] > 2 * cnt[1] ||
          min(cnt[1], cnt[2]) > 2 * (n - j)) {
        continue;
      }
      int l = j + (max(cnt[1], cnt[2]) + 1) / 2,
          r = j + 2 * min(cnt[1], cnt[2]);
      l = max(l, j + 1), r = min(n, r);
      if (l > r) {
        continue;
      }
      int k = myRMQ.query(l, r);
      if (ans[1] == 0 || check(i, j, k)) {
        update(i, j, k);
      }
    }
  }
  for (int i = 1; i <= ans[1]; i++) {
    a[i].val = 1;
  }
  for (int i = ans[1] + 1; i <= ans[2]; i++) {
    a[i].val = 2;
  }
  for (int i = ans[2] + 1; i <= ans[3]; i++) {
    a[i].val = 3;
  }
  for (int i = ans[3] + 1; i <= n; i++) {
    a[i].val = -1;
  }
  sort(a + 1, a + n + 1, cmpb);
  for (int i = 1; i <= n; i++) {
    printf("%d ", a[i].val);
  }
  return 0;
}
