use std::io::*;
use std::str::FromStr;
use std::collections::VecDeque;

#[allow(dead_code)]
fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let stdin = stdin.lock();
    let token: String = stdin
        .bytes()
        .map(|c| c.expect("failed to read char") as char)
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().expect("failed to parse token")
}

fn solve(seq: &Vec<i32>, k: usize, q: usize, min_value: i32, max_value: i32) -> bool {
    let n = seq.len();
    let mut que = VecDeque::<usize>::new();
    let mut use_flags = vec![false; n];
    let mut l = 0;
    let mut cnt = 0;
    let mut small_value = 0;
    let mut large_value = 0;
    let mut ans = 0;
    for i in 0..n {
        cnt += 1;
        if seq[i] < min_value {
            small_value += 1;
        } else if max_value < seq[i] {
            large_value += 1;
        } else {
            que.push_back(i);
        }
        while cnt > k {
            let v = seq[l];
            if v < min_value {
                small_value -= 1;
                cnt -= 1;
            } else if max_value < v {
                large_value -= 1;
                cnt -= 1;
            } else if !use_flags[l] {
                que.pop_front();
                cnt -= 1;
            }
            l += 1;
        }
        if cnt == k && small_value == 0 && large_value != k {
            let index = que.pop_front().unwrap();
            use_flags[index] = true;
            cnt -= 1;
            ans += 1;
            if ans == q {
                return true;
            }
        }
    }
    return false;
}

fn main() {
    let n = read::<usize>();
    let k = read::<usize>();
    let q = read::<usize>();
    let mut seq = vec![0; n];
    for i in 0..n {
        seq[i] = read::<i32>();
    }
    let mut ans = sort_seq[n - 1] - sort_seq[0];
    for i in 0..n {
        let min_value = sort_seq[i];
        let mut left = best_values[i] - 1;
        let mut right = ans;
        while right - left > 1 {
            let mid = (left + right) / 2;
            if solve(&seq, k, q, min_value, min_value + mid) {
                right = mid;
            } else {
                left = mid;
            }
        }
        ans = right;
    }
    println!("{}", ans);
}
