This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define MAX_N 2000006
#define INF 0x3f3f3f3f
int sz;
pair <int ,int> tree[2*MAX_N];
void bld(vector<int>&arr){
    for(int i=sz; i<(sz<<1); i++)
        tree[i] = make_pair(arr[i-sz] ,i-sz);
    for(int i=sz-1; i; i--)
        tree[i] = min(tree[i<<1] ,tree[i<<1|1]);
}
void upd(int p ,int v){
    for(tree[p+=sz].first = v; p>1; p>>=1)
        tree[p>>1] = min(tree[p] ,tree[p^1]);
}
pair <int ,int> qry(int l ,int r){
    auto res = make_pair(INF ,INF);
    for(l+=sz ,r+=sz+1; l<r; l>>=1 ,r>>=1){
        if(l&1) res = min(res ,tree[l++]);
        if(r&1) res = min(res ,tree[--r]);
    }
    return res;
}
#define FL p<<1
#define FR p<<1|1
array <int ,3> tree2[4*MAX_N];
array <int ,3> mrg(array <int ,3>&lf ,array <int ,3>&rt){
    array <int ,3> nw = lf;
    nw[0] += rt[0];
    if(lf[0] + rt[1] > nw[1]){
        nw[1] = lf[0] + rt[1];
        nw[2] = rt[2];
    }
    return nw;
}
void upd2(int i ,int v ,int l = 0 ,int r = sz-1 ,int p = 1){
    if(l == r){
        tree2[p][0] += v;
        tree2[p][1] += v;
        tree2[p][2] = i;
        return;
    }
    int mid = (l+r)>>1;
    if(i <= mid) upd2(i ,v ,l ,mid ,FL);
    else         upd2(i ,v ,mid+1 ,r ,FR);
    tree2[p] = mrg(tree2[FL] ,tree2[FR]);
}
int main()
{
    int n ,k ,T;
    scanf("%d%d%d",&n,&k,&T) ,sz = n+1;
    vector <int> a(n);
    for(int&i : a)
        scanf("%d",&i);
    int ans = 0;
    vector <int> lf(n+1 ,INF);
    vector <pair<int ,int>> q;
    for(int i = 0; i < n; i++){
        while(!q.empty() && q.back().first > T-i)
            q.pop_back();
        if(a[i] <= T){
            while(!q.empty() && q.back().first >= a[i]-i)
                q.pop_back();
            q.push_back({a[i]-i ,i});
        }else if(!q.empty())
            lf[i-1] = q.back().second;
        else
            ans++;
    }
    vector <int> cum(n+1);
    for(int i = 0; i < n; i++) if(lf[i] != INF)
        cum[lf[i]]++ ,cum[i+1]--;
    for(int i = 0; i <= n; i++)
        upd2(i ,cum[i]);
    bld(lf);
    for(int s = 0; s < k && tree2[1][1]; s++){
        int rem = tree2[1][2];
        while(true){
            auto q = qry(rem ,n-1);
            if(q.first > rem)
                break;
            upd2(lf[q.second] ,-1);
            upd2(q.second+1 ,+1);
            lf[q.second] = INF;
            upd(q.second ,INF);
            ans++;
        }
    }
    printf("%d\n",n-ans);
}
Compilation message (stderr)
prison.cpp: In function 'int main()':
prison.cpp:56:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |     scanf("%d%d%d",&n,&k,&T) ,sz = n+1;
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
prison.cpp:59:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |         scanf("%d",&i);
      |         ~~~~~^~~~~~~~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |