Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Minimum Cost Sort

You are given $n$ integers $w_i (i = 0, 1, ..., n-1)$ to be sorted in ascending order. You can swap two integers $w_i$ and $w_j$. Each swap operation has a cost, which is the sum of the two integers $w_i + w_j$. You can perform the operations any number of times.

Write a program which reports the minimal total cost to sort the given integers.

Input

In the first line, an integer $n$ is given. In the second line, $n$ integers $w_i (i = 0, 1, 2, ... n-1)$ separated by space characters are given.

Output

Print the minimal cost in a line.

Constraints

$1 \leq n \leq 1,000$

$0 \leq w_i\leq 10^4$

$w_i$ are all different

Sample Input 1

5
1 5 3 4 2

Sample Output 1

7

Sample Input 2

4
4 3 2 1

Sample Output 2

10

Solution in JavaScript (judge verdict: Accepted)

fs = require("fs");

buf = fs.readFileSync('/dev/stdin').toString();
lines = buf.split('\n');
w = lines[1].split(' ').map(Number);

sorted = [].concat(w).sort((a, b) => { return a - b; });

indeces = w.map((x) => { return sorted.indexOf(x); });

groups = (() => {
    let done = new Array(w.length); // undefined or true
    let res = [];
    for (let i = 0; i < w.length; ++i) {
        if (done[i]) continue;
        let g = [];
        let j = i;
        while (!done[j]) {
            done[j] = true;
            g.push(w[j]);
            j = indeces[j];
        }
        res.push(g);
    }
    return res;
})();

groups = groups
    .filter((g) => { return g.length >= 2; })
    .map((g) => { return g.sort((a, b) => { return a - b; }); });

function sum(ary) { return ary.reduce((a, b) => { return a + b; }, 0); }

function calc_cost(group, min) {
    let min1 = sum(group.slice(1)) + group[0] * (group.length - 1);
    let min2 = sum(group) + group[0] + min * (group.length + 1);
    //console.log("group.slice(1) = ", group.slice(1));
    //console.log("min1 = ", min1, ", min2 = ", min2);
    return Math.min(min1, min2);
}

cost = sum(groups.map((g) => { return calc_cost(g, sorted[0]); }));

//console.log(w);
//console.log(sorted);
//console.log(indeces);
//console.log(groups);
console.log(cost);