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>
#define ll long long
#define ld long double
#define pii pair<int, int>
#define pll pair<ll, ll>
#define vt vector
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
#pragma GCC optimize ("O3")
#pragma GCC optimize ("O2")
#define F first
#define S second
//#define endl '\n'
//#define int long long
using namespace std;
ll delivery(int N, int K, int L, int p[])
{
    if (K == 1)
    {
        ll ans = 0;
        for(int i = 0; i < N; i++) ans += 2 * min(p[i], L - p[i]);
        return ans;
    }
    if (K == N)
    {
        vt<int> v, pos;
        for(int i = 0; i < N; i++) v.pb(p[i]);
        sort(all(v)); pos.pb(v[0]);
        for(int i = 1; i < N; i++)
            if (v[i] != *pos.rbegin()) pos.pb(v[i]);
        ll mn = L;
        for(int i = 0; i < sz(pos) - 1; i++)
            mn = min(mn, 2ll * pos[i] + 2ll * (L - pos[i + 1]));
        mn = min(mn, 2ll * (L - pos[0]));
        mn = min(mn, 2ll * (*pos.rbegin()));
        return mn;
    }
    if (N <= 10)
    {
        vt<int> order(N);
        for(int i = 0; i < N; i++) order[i] = i;
        //for(int x : order) cout << x << " ";
        ll mn = LLONG_MAX;
        do
        {
            ll dp[N][K + 1];
            dp[0][K] = 2ll * min(p[order[0]], L - p[order[0]]);
            for(int i = K - 1; i >= 0; i--)
                dp[0][i] = min(p[order[0]], L - p[order[0]]);
            for(int i = 1; i < N; i++)
            {
                ll tmp = (L - max(p[order[i]], p[order[i - 1]]));
                tmp += min(p[order[i]], p[order[i - 1]]);
                ll dist = min((ll) abs(p[order[i]] - p[order[i - 1]]), tmp);
                dp[i][K] = dp[i - 1][1] + dist + min(p[order[i]], L - p[order[i]]);
                dp[i][K - 1] = dp[i - 1][K] + min(p[order[i]], L - p[order[i]]);
                for(int j = K - 2; j >= 0; j--)
                    dp[i][j] = dp[i - 1][j + 1] + dist;
            }
            ll cur_mn = LLONG_MAX;
            for(int i = 0; i <= K; i++) cur_mn = min(cur_mn, dp[N - 1][i]);
            if (cur_mn + min(p[order[N - 1]], L - p[order[N - 1]]) <= mn)
            {
                mn = min(mn, cur_mn + min(p[order[N - 1]], L - p[order[N - 1]]));
                //cout << mn << endl;
                //for(int x : order) cout << x << " ";
                //cout << endl;
                //for(int x : order) cout << p[x] << " ";
                //cout << endl;
                for(int i = K; i >= 0; i--)
                {
                    //for(int j = 0; j < N; j++) cout << dp[j][i] << " ";
                    //cout << endl;
                }
                //cout << endl;
            }
            //for(int x : order) cout << p[x] << " ";
            //cout << endl;
            for(int i = K; i >= 0; i--)
            {
                //for(int j = 0; j < N; j++) cout << dp[j][i] << " ";
                //cout << endl;
            }
            //cout << endl;
        } while (next_permutation(all(order)));
        return mn;
    }
    if (N <= 1000)
    {
        vt<pii> v;
        for(int i = 0; i < N; i++) v.pb({p[i], i});
        sort(all(v));
        vt<int> order(N);
        for(int i = 0; i < N; i++) order[i] = v[i].S;
        //for(int x : order) cout << x << " ";
        ll mn = LLONG_MAX;
            ll dp[N][K + 1];
            dp[0][K] = 2ll * min(p[order[0]], L - p[order[0]]);
            for(int i = K - 1; i >= 0; i--)
                dp[0][i] = min(p[order[0]], L - p[order[0]]);
            for(int i = 1; i < N; i++)
            {
                ll tmp = (L - max(p[order[i]], p[order[i - 1]]));
                tmp += min(p[order[i]], p[order[i - 1]]);
                ll dist = min((ll) abs(p[order[i]] - p[order[i - 1]]), tmp);
                dp[i][K] = dp[i - 1][1] + dist + min(p[order[i]], L - p[order[i]]);
                dp[i][K - 1] = dp[i - 1][K] + min(p[order[i]], L - p[order[i]]);
                for(int j = K - 2; j >= 0; j--)
                    dp[i][j] = dp[i - 1][j + 1] + dist;
            }
            ll cur_mn = LLONG_MAX;
            for(int i = 0; i <= K; i++) cur_mn = min(cur_mn, dp[N - 1][i]);
            if (cur_mn + min(p[order[N - 1]], L - p[order[N - 1]]) <= mn)
            {
                mn = min(mn, cur_mn + min(p[order[N - 1]], L - p[order[N - 1]]));
                //cout << mn << endl;
                //for(int x : order) cout << x << " ";
                //cout << endl;
                //for(int x : order) cout << p[x] << " ";
                //cout << endl;
                for(int i = K; i >= 0; i--)
                {
                    //for(int j = 0; j < N; j++) cout << dp[j][i] << " ";
                    //cout << endl;
                }
                //cout << endl;
            }
            //for(int x : order) cout << p[x] << " ";
            //cout << endl;
            for(int i = K; i >= 0; i--)
            {
                //for(int j = 0; j < N; j++) cout << dp[j][i] << " ";
                //cout << endl;
            }
            //cout << endl;
        return mn;
    }
}
Compilation message (stderr)
boxes.cpp: In function 'long long int delivery(int, int, int, int*)':
boxes.cpp:151:1: warning: control reaches end of non-void function [-Wreturn-type]
  151 | }
      | ^| # | 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... |