func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1e9 + 7;   const int maxn = 200011;   const int INF = 1 << 25;   const int logN = 18;   int n;   int a[maxn];   bool p[maxn];   int b[maxn];   bool used[maxn];   int main(int argc, char const *argv[]) {     scanf( %d , &(n));     for (int(i) = 0; i < (int)(n); ++(i)) scanf( %d , &(a[i]));     priority_queue<pair<int, int> > pq1, pq2;     for (int(i) = 0; i < (int)(n); ++(i))       pq1.push(make_pair((a[i] - (n - i)), (i)));     for (int i = n - 1; i >= 0; --i) {       while (!pq1.empty() && pq1.top().second > i) pq1.pop();       while (!pq1.empty() && used[pq1.top().second]) pq1.pop();       while (!pq2.empty() && used[pq2.top().second]) pq2.pop();       int id1 = -1, id2 = -1;       if (!pq1.empty()) id1 = pq1.top().second;       if (!pq2.empty()) id2 = pq2.top().second;       int pick;       if (id1 != -1 && id2 != -1) {         if (a[id1] - i + id1 > a[id2] - i + id2) {           pick = id1;           pq1.pop();         } else {           pick = id2;           pq2.pop();         }       } else if (id1 != -1) {         pick = id1;         pq1.pop();       } else {         pick = id2;         pq2.pop();       }       if (pick > i)         b[i] = a[pick] - i + pick;       else         b[i] = a[pick] - i + pick;       used[pick] = 1;       if (!used[i]) pq2.push(make_pair((a[i] + i), (i)));     }     bool f = 1;     for (int(i) = 0; i < (int)(n - 1); ++(i))       if (b[i] > b[i + 1]) f = 0;     if (f)       for (int(i) = 0; i < (int)(n); ++(i))         printf( %d%c , b[i], i == n - 1 ?   n  :    );     else       puts( :( );   }   