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 JAVA (judge verdict: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.Stream;

class Main {

	final static int MAX = 1_000;
	final static int VMAX = 10_000;

	static int n, small;
	static int[] a;
	static int[] b = new int[MAX];
	static int[] truery = new int[VMAX];

	public static void main(String[] args) {

		try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {

			n = Integer.parseInt(br.readLine());
			a = Stream.of(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();

		} catch (IOException e) {
			e.printStackTrace();
		}

		small = VMAX;
		for(int w : a) {
			small = Math.min(small, w);
		}

		int ans = solve();
		System.out.println(ans);

	}

	private static int solve() {
		int ans = 0;
		b = Arrays.copyOf(a, n);						// ??£?????????????????????b
		boolean[] valid = new boolean[MAX];			// ??£?????????????????§?????£???????????????????????£???????????????

		Arrays.sort(b);
		for (int i = 0; i < n; i++) truery[b[i]] = i;	// ????????????number?????¬??\?????????????????????????¨????

		for (int i = 0; i < n; i++) {
			if (valid[i]) continue;
			int cur = i;
			int sum = 0;		// ??????????????????????????????
			int min = VMAX;		// ??????????????§????°???????
			int an = 0;			// ?????????????´???°

			while(true) {
				valid[i] = true;
				an++;
				int val = a[cur];
				min = Math.min(min, val);
				sum += val;
				cur = truery[val];
				if (valid[cur]) break;
			}

			ans += Math.min( sum + (an-2) * min, min + sum + (an+1) * sum );

		}
		return ans;
	}
}