Problem:
Score : 700 points

Problem Statement

We have a directed weighted graph with N vertices.
Each vertex has two integers written on it, and the integers written on Vertex i are A_i and B_i.

In this graph, there is an edge from Vertex x to Vertex y for all pairs 1 \leq x,y \leq N, and its weight is {\rm min}(A_x,B_y).

We will consider a directed cycle in this graph that visits every vertex exactly once.
Find the minimum total weight of the edges in such a cycle.

Constraints

2 \leq N \leq 10^5

1 \leq A_i \leq 10^9

1 \leq B_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 B_1
A_2 B_2
:
A_N B_N

Output

Print the minimum total weight of the edges in such a cycle.

Sample Input 1

3
1 5
4 2
6 3

Sample Output 1

7

Consider the cycle 1→3→2→1. The weights of those edges are {\rm min}(A_1,B_3)=1, {\rm min}(A_3,B_2)=2 and {\rm min}(A_2,B_1)=4, for a total of 7.
As there is no cycle with a total weight of less than 7, the answer is 7.

Sample Input 2

4
1 5
2 6
3 7
4 8

Sample Output 2

10

Sample Input 3

6
19 92
64 64
78 48
57 33
73 6
95 73

Sample Output 3

227

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

#ifdef NON_SUBMIT
#define TEST(n) (n)
#else
#define TEST(n) ((void)0)
#endif

using namespace std;

pair<int, int> tree[1 << 18];

void set_tree(int n, int v, int bit = 1, int s = 1, int e = 100000)
{
	int m = (s + e) >> 1;
	if (s == e) {
		tree[bit] = { v,n };
		return;
	}
	if (n <= m) {
		set_tree(n, v, 2 * bit, s, m);
	}
	else {
		set_tree(n, v, 2 * bit + 1, m + 1, e);
	}
	tree[bit] = max(tree[2 * bit], tree[2 * bit + 1]);
}

int get_value(int n)
{
	int bit = 1, s = 1, e = 100000;
	while (s < e) {
		int m = (s + e) >> 1;
		if (n <= m) {
			bit = 2 * bit;
			e = m;
		}
		else {
			bit = 2 * bit + 1;
			s = m + 1;
		}
	}
	return tree[bit].first;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	TEST(freopen("input.txt", "r", stdin));
	TEST(freopen("output.txt", "w", stdout));
	int N;
	long long ans = 0;
	priority_queue<pair<int, int>> Q;
	cin >> N;
	for (int i = 1; i <= N; i++) {
		int A, B;
		cin >> A >> B;
		Q.push(make_pair(-A, i));
		set_tree(i, B);
	}
	while (!Q.empty()) {
		int v, idx, temp;
		tie(v, idx) = Q.top();
		Q.pop();
		if (temp = get_value(idx)) {
			set_tree(idx, 0);
			if (tree[1].first) {
				ans += min(tree[1].first, -v);
				set_tree(tree[1].second, temp);
			}
			else {
				ans += min(-v, temp);
			}
		}
	}
	cout << ans << '\n';
	return 0;
}