Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

海岸線

海岸には毎秒波が押し寄せる．基準点 P を超えて何 m の地点まで波が押し寄せたかを，T 秒の間だけ毎秒観測し記録したデータがある．データは T 個の整数 x1, ..., xT からなり，各 i (1 ≤ i ≤ T) に対し，観測を始めてから i 秒後には地点 P からちょうど xi m の地点までの波が押し寄せ，海水に浸っていたことを表す．

海岸は，最後に海水に浸ってから D 秒後に乾くことが分かっている．ここで，乾くまでの時間は最後に海水に浸った時間のみに依存し，それ以前に波に浸っていた回数や時間には依存しないことに注意せよ．

基準点 P から，陸の方向に距離 L だけ離れた地点が，観測を開始してから 1 秒後と T 秒後の間に少なくとも何秒間濡れていたかを求めよ．ただし，時刻 0 で海岸は乾いていたことがわかっている．

以下に，Sample Input 第1ケースの図を示す．

図B1: Sample Input 第1ケースの場合

Input

入力データセットは複数のケースから構成される．データセットの個数は最大でも 40 個を超えない．各ケースは次のような形式である．

T D L
x1
...
xT

1 行目には T, D, L (1 ≤ T, D, L ≤ 100,000) が半角スペース区切りで与えられる．続く T 行のうち i (1 ≤ i ≤ T) 行目には xi (0 ≤ xi ≤ 100,000) が与えられる．これらは全て整数である．

データセットの終わりは，3 つの 0 からなる行で表される．

Output

各ケースに対し，基準点 P から，陸の方向に距離 L だけ離れた地点が 1 秒後から T 秒後の間で確実に濡れていた時間 (秒) を 1 行で出力せよ．

Sample Input

5 2 3
3
5
1
2
3
3 100 100
3
3
4
20 3 8
3
2
6
1
9
1
8
4
2
2
8
1
8
8
2
5
3
4
3
8
7 2 2
0
2
5
2
5
2
1
0 0 0

Output for Sample Input

3
0
11
5

Solution in Rust (judge verdict: Accepted)

fn main() {
    let (r, w) = (std::io::stdin(), std::io::stdout());
    let mut sc = IO::new(r.lock(), w.lock());
    loop {
        let t: usize = sc.read();
        let d: usize = sc.read();
        let l: usize = sc.read();
        if t == 0 {
            return;
        }

        let mut x: Vec<i32> = vec![0; t];
        for i in 0..t {
            let z: usize = sc.read();
            if z >= l {
                x[i] += 1;
                if i + d < t {
                    x[i + d] -= 1;
                }
            }
        }

        let mut ans = 0;
        let mut sum = 0;
        for i in 0..(t - 1) {
            sum += x[i];
            if sum > 0 {
                ans += 1;
            }
        }
        println!("{}", ans);
    }
}

pub struct IO<R, W: std::io::Write>(R, std::io::BufWriter<W>);

impl<R: std::io::Read, W: std::io::Write> IO<R, W> {
    pub fn new(r: R, w: W) -> Self {
        IO(r, std::io::BufWriter::new(w))
    }
    pub fn write<S: ToString>(&mut self, s: S) {
        use std::io::Write;
        self.1.write_all(s.to_string().as_bytes()).unwrap();
    }
    pub fn read<T: std::str::FromStr>(&mut self) -> T {
        use std::io::Read;
        let buf = self
            .0
            .by_ref()
            .bytes()
            .map(|b| b.unwrap())
            .skip_while(|&b| b == b' ' || b == b'\n' || b == b'\r' || b == b'\t')
            .take_while(|&b| b != b' ' && b != b'\n' && b != b'\r' && b != b'\t')
            .collect::<Vec<_>>();
        unsafe { std::str::from_utf8_unchecked(&buf) }
            .parse()
            .ok()
            .expect("Parse error.")
    }
    pub fn vec<T: std::str::FromStr>(&mut self, n: usize) -> Vec<T> {
        (0..n).map(|_| self.read()).collect()
    }
    pub fn chars(&mut self) -> Vec<char> {
        self.read::<String>().chars().collect()
    }
}