#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
template <class T>
T gcd(T x, T y) {
  while (T t = x % y) x = y, y = t;
  return y;
}
const double eps = 1e-9;
const double PI = acos(-1.);
const int INF = 1000000000;
const int MOD = 1000000007;
const double E = 2.7182818284590452353602874713527;
bool isdig(char x) { return x >= '0' && x <= '9'; }
bool isup(char x) { return x >= 'A' && x <= 'Z'; }
bool isdown(char x) { return x >= 'a' && x <= 'z'; }
bool islet(char x) { return isup(x) || isdown(x); }
void FILE_IO(string s = "") {
  if (s == "") return;
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}
int N, T, M;
int t[2005];
void get_data() {
  cin >> N >> T >> M;
  for (int i = 0, n = N; i < n; i++) {
    cin >> t[i];
    t[i] += 400;
  }
}
bool mk[1005];
int answer() {
  if (M > T) return -1;
  memset(mk, false, sizeof(mk));
  int ind = 0;
  int cnt = 0;
  bool can = true;
  for (int i = 0, n = N; i < n; i++) {
    int now = t[i];
    ind = max(ind, now - T);
    int have = 0;
    for (int j = ind; j < now; j++) {
      have += mk[j] ? 1 : 0;
    }
    if (have >= M) continue;
    int need = M - have;
    for (int j = now - 1; j >= ind; j--) {
      if (need == 0) break;
      if (mk[j]) continue;
      mk[j] = true;
      cnt++;
      need--;
    }
  }
  return cnt;
}
void run() { cout << answer() << endl; }
int main() {
  FILE_IO();
  int t = 1;
  while (t--) {
    get_data();
    run();
  }
  return 0;
}
