#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MASK(x) (1LL << (x))
#define BIT(x, i) (((x) >> (i)) & 1)
#define SZ(x) ((int) (x).size())
#define ALL(a) (a).begin(), (a).end()
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define FORD(i, a, b) for (int i = (a); i >= (b); --i)
#define left    __left
#define right   __right
#define prev    __prev
#define fi      first
#define se      second
template <class X, class Y>
    bool maximize(X &x, Y y) {
        if (x < y) return x = y, true;
        else return false;
    }
template <class X, class Y>
    bool minimize(X &x, Y y) {
        if (x > y) return x = y, true;
        else return false;
    }
int N, L, R, money;
const int inf = (int) 1e9 + 7;
const long long INF = (long long) 1e18 + 7;
#define MAX_N 102
int a[MAX_N + 2];
namespace subtask1 {
    bool check() {
        return (N <= 13 && R == N);
    }
    void solve() {
        ll ans = 0;
        FOR(i, L, R) ans += 1LL * a[i];
        ll sumCostBase = ans;
        FOR(mask, 0,  MASK(N) - 1) {
            int numBit = __builtin_popcount(mask);
            if (numBit & 1) continue;
            int sumIdPrev = 0, sumCostPrev = 0;
            int sumIdCur  = 0, sumCostCur  = 0;
            int numIdPrev = 0;
            FOR(i, 0, N - 1) if (BIT(mask, i)) {
                int id = i + 1;
                if (id < L) {
                    ++numIdPrev;
                    sumIdPrev += id;
                    sumCostPrev += 1LL * a[id];
                } else {
                    sumIdCur += id;
                    sumCostCur += 1LL * a[id];
                }
            }
            if (numIdPrev != numBit / 2) continue;
            if (sumIdCur - sumIdPrev <= money)
                minimize(ans, sumCostBase + sumCostPrev - sumCostCur);
        }
        cout << ans;
    }
}
namespace subtask4 {
    int dp[2][10'002][102];
    // debug;
    // chua can toi 10'000; ma ~ n^2 ma thoi;
    void solve() {
        memset(dp, 0x3f, sizeof(dp));
        dp[(L - 1) & 1][0][0] = 0;
        a[0] = inf;
        FOR(i, L, R) { // N <=> R;
            memset(dp[i & 1], 0x3f, sizeof(dp[i & 1]));
            FOR(prevUse, 0, money) {
                FOR(nxtID, 0, N) {
                    if (L <= nxtID && nxtID <= R) continue;
                    // khong lam gi ca;
                    minimize(dp[i & 1][prevUse][nxtID], dp[(i - 1) & 1][prevUse][nxtID] + a[i]);
                    // co lam;
                    FOR(prevID, 0, nxtID - 1) {
                        if (L <= prevID && prevID <= R) continue;
                        if (prevUse + abs(i - nxtID) <= money) {
                            minimize(dp[i & 1][prevUse + abs(i - nxtID)][nxtID], dp[(i - 1) & 1][prevUse][prevID] + a[nxtID]);
                        }
                    }
                }
            }
        }
        ll ans = 0;
        FOR(i, L, R) ans += 1LL * a[i];
        FOR(use, 0, money) FOR(id, 0, N) {
            minimize(ans, dp[R & 1][use][id]);
        }
        cout << ans;
    }
}
int main() {
    ios_base::sync_with_stdio(false);cin.tie(nullptr);
    // freopen("holding.inp","r",stdin);
    // freopen("holding.out","w",stdout);
    cin >> N >> L >> R >> money;
    FOR(i, 1, N) cin >> a[i];
    subtask4 :: solve();
    return 0;
}
| # | 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... |