#include <bits/stdc++.h>
const double PI = acos(-1.0);
const int DIR = 4;
const int X[] = {1, 0, -1, 0};
const int Y[] = {0, 1, 0, -1};
const int N = (int)2e5 + 228;
using namespace std;
struct Node {
  int sz = 1, x, y, keep = 0;
  Node *l = NULL, *r = NULL;
  Node() {}
  Node(int _x) : sz(1), x(_x), y(rand()) {}
};
void push(Node* t) {
  if (!t) return;
  if (t->l) {
    t->l->x += t->keep;
    t->l->keep += t->keep;
  }
  if (t->r) {
    t->r->x += t->keep;
    t->r->keep += t->keep;
  }
  t->keep = 0;
}
int sz(Node* t) {
  if (!t) return 0;
  return t->sz;
}
void upd(Node* t) {
  if (!t) return;
  t->sz = 1 + sz(t->l) + sz(t->r);
}
void split(Node* t, int x, Node*& l, Node*& r) {
  push(t);
  if (!t) {
    l = r = NULL;
    return;
  }
  if (t->x + 1 <= x - sz(t->l) - 1) {
    split(t->r, x - sz(t->l) - 1, t->r, r);
    l = t;
  } else {
    split(t->l, x, l, t->l);
    r = t;
  }
  upd(l), upd(r);
}
void merge(Node*& t, Node* l, Node* r) {
  push(l);
  push(r);
  if (!l || !r) {
    if (!l)
      t = r;
    else
      t = l;
    return;
  }
  if (l->y > r->y) {
    merge(l->r, l->r, r);
    t = l;
  } else {
    merge(r->l, l, r->l);
    t = r;
  }
  upd(t);
}
int n, a[N], ptr;
void dfs(Node* t) {
  if (!t) return;
  push(t);
  dfs(t->l);
  a[++ptr] = t->x;
  dfs(t->r);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  Node* t = NULL;
  for (int i = n; i >= 1; i--) {
    Node *l, *r;
    split(t, a[i], l, r);
    Node* cur = new Node(a[i] - sz(l));
    if (l) {
      l->x++;
      l->keep++;
    }
    merge(t, l, cur);
    merge(t, t, r);
  }
  dfs(t);
  for (int i = 2; i <= n; i++) {
    if (a[i] < a[i - 1]) {
      cout << ":(" << endl;
      return 0;
    }
  }
  for (int i = 1; i <= n; i++) printf("%d ", a[i]);
  return 0;
}
