#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;   }