func_code_string: #include <bits/stdc++.h>   using namespace std;   namespace Solve {   const int MAXN = 3005;   inline int mymin(int a, int b) { return a < b ? a : b; }   inline int mymax(int a, int b) { return a > b ? a : b; }   int Log[MAXN], maxid[MAXN][20];   void getLog() {     Log[1] = 0;     for (int i = 2; i <= 3000; i++) {       if (i & 1)         Log[i] = Log[i - 1];       else         Log[i] = Log[i >> 1] + 1;     }     return;   }   void getST(int *A, int n) {     for (int i = 1; i <= n; i++) maxid[i][0] = i;     for (int k = 1; k <= 12; k++) {       for (int i = 1; i + (1 << k) - 1 <= n; i++) {         int f = i + (1 << (k - 1));         if (A[maxid[i][k - 1]] > A[maxid[f][k - 1]])           maxid[i][k] = maxid[i][k - 1];         else           maxid[i][k] = maxid[f][k - 1];       }     }     return;   }   struct Data {     int id, val;     Data(int a = 0, int b = 0) : id(a), val(b) {}     bool operator<(const Data &B) const { return val > B.val; }   } A[MAXN];   int N, D[MAXN], awd[MAXN];   int Qmaxid(int l, int r) {     if (l > r) return 0;     int k = Log[r - l + 1];     int f = r - (1 << k) + 1;     if (D[maxid[l][k]] > D[maxid[f][k]]) return maxid[l][k];     return maxid[f][k];   }   void work() {     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);     A[0].val = 0;     for (int i = 1; i <= N; i++) D[i] = A[i - 1].val - A[i].val;     D[N + 1] = A[N].val;     getLog();     getST(D, N + 1);     int mxi = -1, mxj = -1, mxk = -1, ansi = -1, ansj = -1, ansk = -1;     for (int i = 1; i < N; i++) {       if (A[i].val - A[i + 1].val < mxi) continue;       for (int j = i + 1; j < N; j++) {         if (i > 2 * (j - i)) continue;         if (j - i > 2 * i) break;         if (A[i].val - A[i + 1].val == mxi && A[j].val - A[j + 1].val < mxj)           continue;         int milen = mymin(i, j - i);         int mxlen = mymax(i, j - i);         int low = j + ((mxlen + 1) >> 1) + 1, upp = j + (milen << 1) + 1;         if (low > N + 1) continue;         if (upp > N + 1) upp = N + 1;         int mxid = Qmaxid(low, upp);         if (A[i].val - A[i + 1].val == mxi && A[j].val - A[j + 1].val == mxj &&             D[mxid] < mxk)           continue;         mxi = A[i].val - A[i + 1].val;         mxj = A[j].val - A[j + 1].val;         mxk = D[mxid];         ansi = i, ansj = j, ansk = mxid - 1;       }     }     for (int i = 1; i <= ansi; i++) awd[A[i].id] = 1;     for (int i = ansi + 1; i <= ansj; i++) awd[A[i].id] = 2;     for (int i = ansj + 1; i <= ansk; i++) awd[A[i].id] = 3;     for (int i = ansk + 1; i <= N; i++) awd[A[i].id] = -1;     for (int i = 1; i <= N; i++) printf( %d  , awd[i]);     printf(  n );     return;   }   }  // namespace Solve   int main() {     Solve::work();     return 0;   }   