#include "boxes.h"
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
template<typename T1,typename T2>void chmn(T1 &x,const T2 &y){x=x<y?x:y;}
template<typename T1,typename T2>void chmx(T1 &x,const T2 &y){x=x>y?x:y;}
const ll N=1e7+50,INF=1e18;
int n,K,L,p[N];
struct SlidingMin{
deque<ll>dq;
queue<ll>a;
void push(ll x){
a.push(x);
while(!dq.empty()&&dq.back()>x)dq.pop_back();
dq.push_back(x);
}
void pop(){
ll x=a.front();
a.pop();
if(!dq.empty()&&x==dq.front())dq.pop_front();
}
ll Min(){
if(dq.empty())return INF;
return dq.front();
}
bool Empty(){return a.empty();}
}SD[2];
ll delivery(int _n, int _K, int _L, int _p[]) {
n=_n,K=_K,L=_L;
for(int i=1;i<=n;i++)p[i]=_p[i-1];
sort(p+1,p+n+1);
ll dp[n+5]={0};
for(int j=1,i=1;i<=n;i++){
dp[i]=INF;
SD[1].push(dp[i-1]+L-p[i]+min(p[i],L-p[i]));
while(j<=i&&L-p[j]+min(p[j],L-p[j])>=p[i]+min(p[i],L-p[i])){
SD[0].push(dp[j-1]);
SD[1].pop();
j++;
}
while(j<i-K){
SD[1].pop();
j++;
}
if(i-K>=1){
if(!SD[0].Empty())SD[0].pop();
else if(!SD[1].Empty()) SD[1].pop(),j++;
}
chmn(dp[i],SD[0].Min()+p[i]+min(p[i],L-p[i]));
chmn(dp[i],SD[1].Min());
}
ll res=dp[n];
return res;
}