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 Haskell (GHC 7.10.3) (judge verdict: Time Limit Exceeded)

import Data.List
import qualified Data.Set as S

apply n f x = foldr ($) x (replicate n f)

main = do
 n <- readLn
 as <- map read . words <$> getLine
 print (n3 n as)
 
n3 n as = maximum (fsearch n q1 (zip as2 [0..]) q2)
 where
  (as1,as2) = splitAt n as
  q1 = S.fromList (zip as1 [0..])
  q2 = S.fromList (zip as2 [0..])

fsearch n q1 ais q2 = do
 let rh0 = sum (map fst (S.elems q1))
 let rl0 = sum (map fst (S.elems q2))
 k <- [0..n]
 let (rh,rl) = transfer (n-k) k (rh0,q1) ais (rl0,q2)
 return (rh - rl)

transfer n' 0 (rh,_) _ (rl,q2) = let (rl',_) = apply n' delmax (rl,q2) in (rh,rl')
 where
  delmax (m,q) = let ((vmax,_),q') = S.deleteFindMax q in (m-vmax,q')

transfer n' k (rh,q1) ((a,i2):ais) (rl,q2) = transfer n' (k-1) (rh-vmin+a, S.insert (a,i1) q1') ais (rl-a,q2')
 where
  ((vmin,i1),q1') = S.deleteFindMin q1
  q2' = S.delete (a,i2) q2