#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx")
using namespace std;
const int cm = 1 << 15;
char cn[cm], *ci = cn, ct;
inline int getint() {
  int A = 0;
  while ((ct = *ci++) >= '0') A = A * 10 + ct - '0';
  return A;
}
int main() {
  fread_unlocked(cn, 1, cm, stdin);
  int N = getint(), K = getint(), Q = getint();
  long long A[2002];
  int LR[2002];
  for (int i = 1; i <= (N); i++) A[i] = ((long long)getint() << 16) + i;
  for (int i = 0; i < (N + 2); i++) LR[i] = -1;
  priority_queue<int> q;
  priority_queue<int, vector<int>, greater<int>> q2[2002];
  auto q3 = q2;
  int kotae = 1e9;
  int saishou = 2e9;
  sort(A + 1, A + N + 1);
  const int m = (1 << 16) - 1;
  for (int i = N; i >= 1; i--) {
    int a = A[i] >> 16;
    int k = A[i] & m;
    int l = (LR[k - 1] == -1) ? k : LR[k - 1];
    int r = (LR[k + 1] == -1) ? k : LR[k + 1];
    LR[l] = r;
    LR[r] = l;
    if (k + k > l + r) {
      while (q3[l].size()) {
        int tmp = q3[l].top();
        q3[k + 1].push(tmp);
        q3[l].pop();
      }
      q3 = q3 + k - l + 1;
    } else {
      while (q3[k + 1].size()) {
        int tmp = q3[k + 1].top();
        q3[l].push(tmp);
        q3[k + 1].pop();
      }
    }
    q3[l].push(a);
    while (q3[l].size() >= K) {
      int tmp = q3[l].top();
      q.push(tmp);
      q3[l].pop();
    }
    while (q.size() >= Q) {
      int tmp = q.top();
      saishou = min(saishou, tmp);
      q.pop();
    }
    kotae = min(kotae, saishou - a);
  }
  printf("%d", kotae);
  return 0;
}
