#include <bits/stdc++.h>
using namespace std;
struct node {
  int s[2];
  int val, sz;
  int tag;
} t[200005];
int n, a[200005];
int root, num;
int L, R, M, tp;
int st[200005], tot;
void maintain(int rt) { t[rt].sz = t[t[rt].s[0]].sz + t[t[rt].s[1]].sz + 1; }
void pushdown(int rt) {
  if (t[rt].tag) {
    if (t[rt].s[0]) {
      t[t[rt].s[0]].val += t[rt].tag;
      t[t[rt].s[0]].tag += t[rt].tag;
    }
    if (t[rt].s[1]) {
      t[t[rt].s[1]].val += t[rt].tag;
      t[t[rt].s[1]].tag += t[rt].tag;
    }
    t[rt].tag = 0;
  }
}
void rotate(int& rt, int d) {
  int k = t[rt].s[d ^ 1];
  t[rt].s[d ^ 1] = t[k].s[d];
  t[k].s[d] = rt;
  maintain(rt);
  maintain(k);
  rt = k;
}
void splay(int& rt, int k) {
  if (rt == 0) return;
  pushdown(rt);
  if (k == t[t[rt].s[0]].sz + 1) return;
  if (k <= t[t[rt].s[0]].sz) {
    int& o = t[rt].s[0];
    pushdown(o);
    if (k == t[t[o].s[0]].sz + 1)
      rotate(rt, 1);
    else if (k <= t[t[o].s[0]].sz) {
      splay(t[o].s[0], k);
      rotate(rt, 1);
      rotate(rt, 1);
    } else {
      k -= t[t[o].s[0]].sz + 1;
      splay(t[o].s[1], k);
      rotate(o, 0);
      rotate(rt, 1);
    }
  } else {
    k -= t[t[rt].s[0]].sz + 1;
    int& o = t[rt].s[1];
    pushdown(o);
    if (k == t[t[o].s[0]].sz + 1)
      rotate(rt, 0);
    else if (k <= t[t[o].s[0]].sz) {
      splay(t[o].s[0], k);
      rotate(o, 1);
      rotate(rt, 0);
    } else {
      k -= t[t[o].s[0]].sz + 1;
      splay(t[o].s[1], k);
      rotate(rt, 0);
      rotate(rt, 0);
    }
  }
}
void print(int rt) {
  if (rt == 0) return;
  pushdown(rt);
  print(t[rt].s[0]);
  st[++tot] = t[rt].val;
  print(t[rt].s[1]);
}
void out(int rt) {
  if (rt == 0) return;
  pushdown(rt);
  print(t[rt].s[0]);
  printf("%d ", t[rt].val);
  print(t[rt].s[1]);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  root = num = 1;
  t[1].s[0] = t[1].s[1] = 0;
  t[1].val = a[n];
  t[1].sz = 1;
  t[1].tag = 0;
  for (int i = n - 1; i >= 1; i--) {
    splay(root, 1);
    if (a[i] <= t[root].val) {
      t[root].s[0] = ++num;
      t[num].s[0] = t[num].s[1] = 0;
      t[num].val = a[i];
      t[num].sz = 1;
      t[num].tag = 0;
      maintain(root);
      continue;
    }
    L = 1;
    R = t[root].sz;
    while (L <= R) {
      M = (L + R) >> 1;
      splay(root, M);
      if (a[i] - t[t[root].s[0]].sz - 1 >= t[root].val + 1)
        L = M + 1, tp = M;
      else
        R = M - 1;
    }
    if (tp < 1 || tp > t[root].sz) {
      puts(":(");
      return 0;
    }
    if (tp == num) {
      splay(root, tp);
      t[root].s[1] = ++num;
      t[num].s[0] = t[num].s[1] = 0;
      t[num].val = a[i] - tp;
      t[num].sz = 1;
      t[num].tag = 0;
      maintain(root);
    } else {
      splay(root, tp);
      splay(t[root].s[1], 1);
      t[t[root].s[1]].s[0] = ++num;
      t[num].s[0] = t[num].s[1] = 0;
      t[num].val = a[i] - tp;
      t[num].sz = 1;
      t[num].tag = 0;
      maintain(t[root].s[1]);
      maintain(root);
    }
    splay(root, tp + 1);
    t[t[root].s[0]].val++;
    t[t[root].s[0]].tag++;
  }
  print(root);
  for (int i = 1; i < tot; i++)
    if (st[i] > st[i + 1]) {
      puts(":(");
      return 0;
    }
  for (int i = 1; i <= tot; i++)
    if (st[i] < 0) {
      puts(":(");
      return 0;
    }
  for (int i = 1; i <= tot; i++) printf("%d ", st[i]);
}
