#include <bits/stdc++.h>
#pragma GCC optimize("O3")
template <typename T>
bool uax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool uin(T& a, T b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
using namespace std;
const int inf = 1e9 + 500500;
int get(vector<int>& dsu, int i) {
  return dsu[i] != i ? dsu[i] = get(dsu, dsu[i]) : i;
}
void solve_e_fast() {
  int n, k, q;
  cin >> n >> k >> q;
  vector<int> a(n);
  vector<multiset<int>> S(n);
  multiset<int> S0, S1;
  vector<int> dsu(n);
  for (int i = 0; i < (int)(n); ++i) dsu[i] = i;
  auto merge = [&](int i, int j) {
    if ((i = get(dsu, i)) == (j = get(dsu, j))) return;
    if (S[i].size() < S[j].size()) swap(i, j);
    dsu[j] = i;
    for (int x : S[j]) S[i].insert(x);
    S[j].clear();
  };
  for (int i = 0; i < (int)(n); ++i) {
    cin >> a[i];
    S[i].insert(a[i]);
  }
  int ans = inf;
  vector<int> ord(n);
  for (int i = 0; i < (int)(n); ++i) ord[i] = i;
  sort((ord).begin(), (ord).end(),
       [&](int i, int j) { return make_pair(a[i], i) > make_pair(a[j], j); });
  vector<int> used(n, 0);
  for (int i : ord) {
    if (i + 1 < n && used[i + 1]) merge(i, i + 1);
    if (i > 0 && used[i - 1]) merge(i, i - 1);
    used[i] = 1;
    i = get(dsu, i);
    while (S[i].size() > k - 1) {
      S0.insert(*S[i].begin());
      S[i].erase(S[i].begin());
    }
    while (S0.size() >= q) {
      S1.insert(*S0.rbegin());
      S0.erase(prev(S0.end()));
    }
    if (S0.size() == q - 1 && !S1.empty()) {
      uin(ans, *(S1.begin()) - *(S0.begin()));
    }
  }
  cout << ans << endl;
}
void solve_e() {
  int n, k, q;
  cin >> n >> k >> q;
  vector<int> a(n);
  for (int i = 0; i < (int)(n); ++i) cin >> a[i];
  int ans = inf;
  vector<int> b(a);
  sort((b).begin(), (b).end());
  b.erase(unique((b).begin(), (b).end()), b.end());
  vector<int> t, z;
  for (int L : b) {
    t.clear();
    z.clear();
    for (int x : a) {
      if (x < L) {
        if (t.size() >= k) {
          nth_element(t.begin(), t.begin() + t.size() - k, t.end());
          z.insert(z.end(), t.begin(), t.begin() + t.size() - k + 1);
        }
        t.clear();
      } else
        t.push_back(x);
    }
    if (t.size() >= k) {
      nth_element(t.begin(), t.begin() + t.size() - k, t.end());
      z.insert(z.end(), t.begin(), t.begin() + t.size() - k + 1);
    }
    if (z.size() >= q) {
      nth_element(z.begin(), z.begin() + q - 1, z.end());
      if (q > 1) {
        nth_element(z.begin(), z.begin() + 1, z.begin() + q - 1);
      }
      uin(ans, z[q - 1] - z[0]);
    } else
      break;
  }
  cout << ans << endl;
}
int main() {
  solve_e_fast();
  return 0;
}
