Problem: A top-secret military base under the command of Colonel Zuev is expecting an inspection from the Ministry of Defence. According to the charter, each top-secret military base must include a top-secret troop that should... well, we cannot tell you exactly what it should do, it is a top secret troop at the end. The problem is that Zuev's base is missing this top-secret troop for some reasons.

The colonel decided to deal with the problem immediately and ordered to line up in a single line all n soldiers of the base entrusted to him. Zuev knows that the loquacity of the i-th soldier from the left is equal to qi. Zuev wants to form the top-secret troop using k leftmost soldiers in the line, thus he wants their total loquacity to be as small as possible (as the troop should remain top-secret). To achieve this, he is going to choose a pair of consecutive soldiers and swap them. He intends to do so no more than s times. Note that any soldier can be a participant of such swaps for any number of times. The problem turned out to be unusual, and colonel Zuev asked you to help.

Determine, what is the minimum total loquacity of the first k soldiers in the line, that can be achieved by performing no more than s swaps of two consecutive soldiers.

Input

The first line of the input contains three positive integers n, k, s (1 ≤ k ≤ n ≤ 150, 1 ≤ s ≤ 109) — the number of soldiers in the line, the size of the top-secret troop to be formed and the maximum possible number of swap operations of the consecutive pair of soldiers, respectively.

The second line of the input contains n integer qi (1 ≤ qi ≤ 1 000 000) — the values of loquacity of soldiers in order they follow in line from left to right.

Output

Print a single integer — the minimum possible total loquacity of the top-secret troop.

Examples

Input

3 2 2
2 4 1


Output

3


Input

5 4 2
10 1 6 2 5


Output

18


Input

5 2 3
3 1 4 2 5


Output

3

Note

In the first sample Colonel has to swap second and third soldiers, he doesn't really need the remaining swap. The resulting soldiers order is: (2, 1, 4). Minimum possible summary loquacity of the secret troop is 3. In the second sample Colonel will perform swaps in the following order:

  1. (10, 1, 6 — 2, 5) 
  2. (10, 1, 2, 6 — 5) 



The resulting soldiers order is (10, 1, 2, 5, 6). 

Minimum possible summary loquacity is equal to 18.

Solution (in JAVA):

Solution:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.*;

public class C590D {

    public static void main(String[] args) throws Exception {
        new C590D().run();
        out.close();
    }

    void setArr(int[][] arr, int val) {
        for (int j = 1; j < arr.length; ++j) {
            Arrays.fill(arr[j], val);
        }
    }

    void run() throws Exception {
        int n = nextInt();
        int k = nextInt();
        int s = nextInt();
        int[] talk = nextIntArray(n);
        final int BIG = 1000000000;
        int m = Math.min(k, n - k);
        int t = 3725;
        int[][][] dp = new int[2][m + 1][t + 1];
        int[][] next = new int[m + 1][t + 1];
        for (int i = 0; i < 2; ++i) {
            setArr(dp[i], BIG * (2 * i - 1));
            setArr(next, BIG * (2 * i - 1));
            int startPos = k - 1 + i;
            int dir = 2 * i - 1;
            int nSteps = n * i - k * dir;
            for (int j = 0; j < nSteps; ++j) {
                int pos = startPos + j * dir;
                int maxSum = j * (j - 1) / 2;
                for (int l = 0; l <= Math.min(j, m - 1); ++l) {
                    for (int p = 0; p <= Math.min(maxSum, t - j); ++p) {
                        if (i == 0) {
                            next[l][p] = Math.max(next[l][p], dp[i][l][p]);
                            next[l + 1][p + j] = Math.max(next[l + 1][p + j],
                                    dp[i][l][p] + talk[pos]);
                        } else {
                            next[l][p] = Math.min(next[l][p], dp[i][l][p]);
                            next[l + 1][p + j] = Math.min(next[l + 1][p + j],
                                    dp[i][l][p] + talk[pos]);
                        }
                    }
                }
                for (int l = 0; l < next.length; ++l) {
                    for (int p = 0; p < next[l].length; ++p) {
                        dp[i][l][p] = next[l][p];
                    }
                }
            }
            for (int j = 0; j < m + 1; ++j) {
                int curBestVal = BIG * (2 * i - 1);
                for (int l = 0; l < dp[i][j].length; ++l) {
                    if (i == 0 == dp[i][j][l] > curBestVal) {
                        curBestVal = dp[i][j][l];
                    }
                    dp[i][j][l] = curBestVal;
                }
            }
        }
        int res = 0;
        for (int i = 0; i < k; ++i) {
            res += talk[i];
        }
        int minAdd = 0;
        for (int i = 0; i <= m; ++i) {
            for (int j = 0; j <= Math.min(s - i, t); ++j) {
                minAdd = Math.min(minAdd, dp[1][i][j] - dp[0][i][Math.min(s - j - i, t)]);
            }
        }
        out.print(res + minAdd);
    }

//~~~~~~~~~~~~~~~~~~~~~~~~~~~ template ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int[] nextIntArray(int n) throws IOException {
        int[] res = new int[n];
        for (int i = 0; i < n; ++i) {
            res[i] = nextInt();
        }
        return res;
    }

    int[][] nextIntArray(int nx, int ny) throws IOException {
        int[][] res = new int[nx][ny];
        for (int i = 0; i < nx; ++i) {
            for (int j = 0; j < ny; ++j) {
                res[i][j] = nextInt();
            }
        }
        return res;
    }

    long[] nextLongArray(int n) throws IOException {
        long[] res = new long[n];
        for (int i = 0; i < n; ++i) {
            res[i] = nextLong();
        }
        return res;
    }

    long[][] nextLongArray(int nx, int ny) throws IOException {
        long[][] res = new long[nx][ny];
        for (int i = 0; i < nx; ++i) {
            for (int j = 0; j < ny; ++j) {
                res[i][j] = nextLong();
            }
        }
        return res;
    }

    int[][] newIntArray(int nx, int ny, int val) {
        int[][] res = new int[nx][ny];
        for (int i = 0; i < nx; ++i) {
            Arrays.fill(res[i], val);
        }
        return res;
    }

    int[][][] newIntArray(int nx, int ny, int nz, int val) {
        int[][][] res = new int[nx][ny][nz];
        for (int i = 0; i < nx; ++i) {
            for (int j = 0; j < ny; ++j) {
                Arrays.fill(res[i][j], val);
            }
        }
        return res;
    }

    long[][] newLongArray(int nx, int ny, long val) {
        long[][] res = new long[nx][ny];
        for (int i = 0; i < nx; ++i) {
            Arrays.fill(res[i], val);
        }
        return res;
    }

    long[][][] newLongArray(int nx, int ny, int nz, long val) {
        long[][][] res = new long[nx][ny][nz];
        for (int i = 0; i < nx; ++i) {
            for (int j = 0; j < ny; ++j) {
                Arrays.fill(res[i][j], val);
            }
        }
        return res;
    }

    String nextToken() throws IOException {
        while (strTok == null || !strTok.hasMoreTokens()) {
            String line = in.readLine();
            if (line == null) {
                return null;
            }
            strTok = new StringTokenizer(line);
        }
        return strTok.nextToken();
    }

    double nextDouble() throws IOException {
        return Double.parseDouble(nextToken());
    }

    int nextInt() throws IOException {
        return Integer.parseInt(nextToken());
    }

    long nextLong() throws IOException {
        return Long.parseLong(nextToken());
    }

    static StringTokenizer strTok;
    final static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    final static PrintWriter out = new PrintWriter(System.out);
}