#include <bits/stdc++.h>
template <typename T>
using MaxHeap = std::priority_queue<T>;
template <typename T>
using MinHeap = std::priority_queue<T, std::vector<T>, std::greater<T>>;
template <typename T>
inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
void vdeb(std::vector<T> &da) {
  for (int i = 0; i < da.size(); i++) {
    if (i == da.size() - 1)
      std::cout << da[i];
    else
      std::cout << da[i] << ' ';
  }
  std::cout << '\n';
}
template <typename T>
void vdeb(std::vector<std::vector<T>> &da) {
  for (int i = 0; i < da.size(); i++) {
    std::cout << i << ' ';
    vdeb(da[i]);
  }
  std::cout << '\n';
}
using namespace std;
int cal(vector<bool> &ju, int k) {
  int ret = 0, cnt = 0, n = ju.size();
  for (int i = (0); i < (int)(n); i++) {
    if (ju[i])
      cnt = 0;
    else
      ++cnt;
    if (cnt >= k) ++ret;
  }
  return ret;
}
int main() {
  int n, k, q;
  cin >> n >> k >> q;
  vector<int> da(n * 2, INT_MAX);
  for (int i = (0); i < (int)(n); i++) cin >> da[i];
  vector<bool> ju(n);
  map<int, vector<int>> mp;
  for (int i = (0); i < (int)(n); i++) {
    if (mp.count(da[i]))
      mp[da[i]].push_back(i);
    else
      mp[da[i]] = {i};
  }
  sort(da.begin(), da.end());
  int ans = da[q - 1] - da[0], now = 0;
  for (auto i : mp) {
    now += i.second.size();
    for (auto j : i.second) ju[j] = true;
    if (cal(ju, k) >= q)
      chmin(ans, da[now + q - 1] - da[now]);
    else
      break;
  }
  cout << ans << endl;
}
