use std::io::*;
use std::str::FromStr;
use std::collections::BTreeMap;
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) -> i32 {
    let n = seq.len();
    let mut open = BTreeMap::<i32, usize>::new();
    let mut que = VecDeque::<i32>::new();
    let mut cnt = 0;
    let mut ans_seq = vec![];
    for i in 0..n {
        cnt += 1;
        que.push_back(seq[i]);
        *open.entry(seq[i]).or_insert(0) += 1;
        while cnt > k {
            let v = que[0];
            que.pop_front();
            if open.contains_key(&v) {
                cnt -= 1;
                *open.get_mut(&v).unwrap() -= 1;
                if open[&v] == 0 {
                    open.remove(&v);
                }
            }
        }
        if cnt == k {
            let &v = open.iter().next().unwrap().0;
            if min_value <= v && v <= max_value {
                cnt -= 1;
                *open.get_mut(&v).unwrap() -= 1;
                if open[&v] == 0 {
                    open.remove(&v);
                }
                ans_seq.push(v);
            }
        }
    }
    if ans_seq.len() < q {
        return max_value;
    }
    ans_seq.sort();
    let ret = ans_seq[q - 1] - ans_seq[0];
    assert!(ret <= max_value - min_value);
    ret
}

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 = 1e+9 as i32;
    for i in 0..n {
        let min_value = seq[i];
        let mut left = 0;
        let mut right = ans;
        while right - left > 1 {
            let mid = (left + right) / 2;
            let v = solve(&seq, k, q, min_value, min_value + mid);
            // println!("{} {} {} {}", left, right, mid, v);
            if v <= mid {
                right = v;
            } else {
                left = mid;
            }
        }
        ans = right;
    }
    println!("{}", ans);
}
