#include <bits/stdc++.h>
using namespace std;
long long getMax(vector<long long>& d) {
  sort(d.begin(), d.end());
  reverse(d.begin(), d.end());
  long long result = 0;
  long long prefSum = 0;
  long long sufSum = 0, p = d.size();
  for (long long i = 0; i < d.size(); ++i) {
    if (p == i) {
      sufSum -= d[i];
      ++p;
    }
    while (p > i + 1 && d[p - 1] < i + 1) {
      sufSum += d[p - 1];
      --p;
    }
    prefSum += d[i];
    result = max(
        result, prefSum - sufSum - i * (i + 1) - (i + 1) * max(p - i - 1, 0LL));
  }
  return result;
}
bool check(vector<long long>& d, long long t) {
  bool result = false;
  d.push_back(t);
  long long x = getMax(d);
  if (x <= 0) {
    result = true;
  }
  for (long long i = 0; i < d.size(); ++i) {
    if (d[i] == t) {
      swap(d[i], d[d.size() - 1]);
      d.pop_back();
      break;
    }
  }
  return result;
}
int32_t main() {
  long long n;
  cin >> n;
  vector<long long> d(n);
  for (long long i = 0; i < n; ++i) {
    cin >> d[i];
  }
  long long sumDegree = 0;
  for (long long i = 0; i < n; ++i) {
    sumDegree += d[i];
  }
  long long minDegree = getMax(d);
  minDegree = max(minDegree, 0LL);
  if ((minDegree + sumDegree) % 2 == 1) {
    minDegree++;
  }
  if (!check(d, minDegree)) {
    cout << "-1\n";
    return 0;
  }
  long long lo = 0, hi = n;
  while (hi - lo > 1) {
    long long mid = (lo + hi) / 2;
    if (!check(d, mid * 2 + minDegree)) {
      hi = mid;
    } else {
      lo = mid;
    }
  }
  long long maxDegree = lo * 2 + minDegree;
  if (minDegree > maxDegree) {
    cout << "-1\n";
    return 0;
  }
  for (long long i = minDegree; i <= maxDegree; i += 2) {
    cout << i << ' ';
  }
  cout << '\n';
  return 0;
}
