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 C++14 (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;
#define SZ(x) (int)(x.size())
#define REP(i, n) for(int i=0;i<(n);++i)
#define FOR(i, a, b) for(int i=(a);i<(b);++i)
#define RREP(i, n) for(int i=(int)(n)-1;i>=0;--i)
#define RFOR(i, a, b) for(int i=(int)(b)-1;i>=(a);--i)
#define ALL(a) a.begin(),a.end()
#define DUMP(x) cerr<<#x<<" = "<<(x)<<endl
#define DEBUG(x) cerr<<#x<<" = "<<(x)<<" (L"<<__LINE__<<")"<< endl;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using P = pair<int, int>;
const double eps = 1e-8;
const ll MOD = 1000000007;
const int INF = INT_MAX / 2;
const ll LINF = LLONG_MAX / 2;
template <typename T1, typename T2>
bool chmax(T1 &a, const T2 &b) {
    if (a < b) { a = b; return true; }
    return false;
}
template <typename T1, typename T2>
bool chmin(T1 &a, const T2 &b) {
    if (a > b) { a = b; return true; }
    return false;
}
template<typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
    os << "[";
    REP(i, SZ(v)) {
        if (i) os << ", ";
        os << v[i];
    }
    return os << "]";
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const map<T1, T2> &mp) {
    os << "{";
    int a = 0;
    for (auto &tp : mp) {
        if (a) os << ", "; a = 1;
        os << tp;
    }
    return os << "}";
}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
    os << p.first << ":" << p.second;
    return os;
}


int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);

    for (;;) {
        int T, D, L; cin >> T >> D >> L;
        if (T == 0) break;

        vi sum(T+1);
        FOR(i, 1, T+1) {
            int x; cin >> x;
            if (x >= L) {
                ++sum[i];
                --sum[min(i + D, T)];
            }
        }
        REP(i, T) {
            sum[i+1] += sum[i];
        }

        int ans = 0;
        for (int s : sum) {
            if (s) ++ans;
        }
        cout << ans << endl;
    }

    return 0;
}