Problem:
Score : 500 points

Problem Statement

Let N be a positive integer.

There is a numerical sequence of length 3N, a = (a_1, a_2, ..., a_{3N}).
Snuke is constructing a new sequence of length 2N, a', by removing exactly N elements from a without changing the order of the remaining elements.
Here, the score of a' is defined as follows: (the sum of the elements in the first half of a') - (the sum of the elements in the second half of a').

Find the maximum possible score of a'.

Constraints

1 ≤ N ≤ 10^5

a_i is an integer.

1 ≤ a_i ≤ 10^9

Partial Score

In the test set worth 300 points, N ≤ 1000.

Input

Input is given from Standard Input in the following format:

N
a_1 a_2 ... a_{3N}

Output

Print the maximum possible score of a'.

Sample Input 1

2
3 1 4 1 5 9

Sample Output 1

1

When a_2 and a_6 are removed, a' will be (3, 4, 1, 5), which has a score of (3 + 4) - (1 + 5) = 1.

Sample Input 2

1
1 2 3

Sample Output 2

-1

For example, when a_1 are removed, a' will be (2, 3), which has a score of 2 - 3 = -1.

Sample Input 3

3
8 2 2 7 4 6 5 3 8

Sample Output 3

5

For example, when a_2, a_3 and a_9 are removed, a' will be (8, 7, 4, 6, 5, 3), which has a score of (8 + 7 + 4) - (6 + 5 + 3) = 5.

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

#include "bits/stdc++.h"
using namespace std;
#define ll long long int
#define rep(i,n) for( int i = 0; i < n; i++ )
#define rrep(i,n) for( int i = n; i >= 0; i-- )
#define REP(i,s,t) for( int i = s; i <= t; i++ )
#define RREP(i,s,t) for( int i = s; i >= t; i-- )
#define dump(x)  cerr << #x << " = " << (x) << endl;
#define INF 2000000000
#define mod 1000000007
#define INF2 1000000000000000000
#define int long long
vector<int> a[3];
int sum[2][100010];
int ans[2][100010];
signed main(void)
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    int N; cin >> N;
    rep(i, 3) rep(j, N) {
        int A; cin >> A;
        a[i].push_back(A);
    } 
    int L = 0, R = 0;
    sort(a[0].begin(), a[0].end());
    sort(a[2].begin(), a[2].end(),greater<int>());
    rep(i, N) L += a[0][i];
    rep(i, N) R += a[2][i];
    int ans0 = L - R;
    rep(i, N) {
        sum[0][i + 1] += a[1][i] - a[0][i] + sum[0][i];
    }
    rep(i, N) {
        sum[1][i + 1] += -a[1][N - i - 1] + a[2][i] + sum[1][i];
    }
    rep(i, N) {
        ans[0][i + 1] = max(sum[0][i + 1], ans[0][i]);
    }
    rep(i, N) {
        ans[1][i + 1] = max(sum[1][i + 1], ans[1][i]);
    }
    // cout << ans0 << endl;
    // rep(i, N + 1) cout << sum[0][i] << " ";
    // cout << endl;
    // rep(i, N + 1) cout << sum[1][i] << " ";
    // cout << endl;
    // rep(i, N + 1) cout << ans[0][i] << " ";
    // cout << endl;
    // rep(i, N + 1) cout << ans[1][i] << " ";
    // cout << endl;
    int ret = -INF2;
    rep(i, N + 1) {
        ret = max(ret, ans0 + ans[0][i] + ans[1][N - i]);
    }
    cout << ret << endl;


    return 0;
}

// 3 1 |4 1| 5 9

// 8 2 2 |7 4 6| 5 3 8
// +5 +2 -2
// -2 +1 +2

// 8 2 2 |7 1 6| 5 3 8
// +5 -1 +4  5 5 8
// -4 +4 +2  6 6 2