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 Pascal (FPC 2.6.2) (judge verdict: Wrong Answer)

const   fi      ='';
        fo      ='';

var     n,top:longint;
        f,g:text;
        a,q,vt:array[0..300005] of longint;
        l,r:array[0..300005] of longint;

procedure       nhap;
var     i:longint;
begin
        assign(f,fi);reset(f);
        readln(f,n);
        for i:=1 to 3*n do
                read(f,a[i]);
        close(f);
end;

procedure       up(k    :longint);
var     v       :longint;
begin
        v:=q[k];
        while (a[v]<a[q[k div 2]]) do
                begin
                        q[k]:=q[k div 2];
                        vt[q[k]]:=k;
                        k:=k div 2;
                end;
        q[k]:=v;
        vt[q[k]]:=k;
end;

procedure       down(k  :longint);
var     l1,v    :longint;
begin
        v:=q[k];
        while 2*k<=top do
                begin
                        l1:=2*k;
                        if (l1<top) and (a[q[l1]]>a[q[l1+1]]) then inc(l1);
                        if a[q[l1]]>=a[v] then break;
                        q[k]:=q[l1];
                        vt[q[k]]:=k;
                        k:=l1;
                end;
        q[k]:=v;
        vt[v]:=k;
end;

procedure       put(u   :longint);
begin
        inc(top); q[top]:=u; vt[u]:=top;
        up(top);
end;

function        get     :longint;
begin
        get:=q[1];    vt[q[1]]:=round(1e9);
        q[1]:=q[top]; vt[q[1]]:=1;
        dec(top);
        down(1);
end;

procedure       up1(k    :longint);
var     v       :longint;
begin
        v:=q[k];
        while (a[v]>a[q[k div 2]]) do
                begin
                        q[k]:=q[k div 2];
                        vt[q[k]]:=k;
                        k:=k div 2;
                end;
        q[k]:=v;
        vt[q[k]]:=k;
end;

procedure       down1(k  :longint);
var     l1,v    :longint;
begin
        v:=q[k];
        while 2*k<=top do
                begin
                        l1:=2*k;
                        if (l1<top) and (a[q[l1]]<a[q[l1+1]]) then inc(l1);
                        if a[q[l1]]<=a[v] then break;
                        q[k]:=q[l1];
                        vt[q[k]]:=k;
                        k:=l1;
                end;
        q[k]:=v;
        vt[v]:=k;
end;

procedure       put1(u   :longint);
begin
        inc(top); q[top]:=u; vt[u]:=top;
        up1(top);
end;

function        get1     :longint;
begin
        get1:=q[1];    vt[q[1]]:=round(1e9);
        q[1]:=q[top]; vt[q[1]]:=1;
        dec(top);
        down1(1);
end;




procedure       xl;
var     tong,res:int64;
        i,u:longint;
begin
        assign(g,fo);rewrite(g);
        tong:=0;  top:=0;q[0]:=0;a[0]:=-round(1e9);
        for i:=1 to n do
        begin
                tong:=tong+a[i];
                put(i);
        end;
        l[n]:=tong;
        for i:=n+1 to 2*n+1 do
        begin
                if a[i]>a[q[1]] then
                begin
                        u:=get;
                        l[i]:=l[i-1]+a[i]-a[u];
                        put(i);
                end else begin l[i]:=l[i-1];end;
        end;
        tong:=0;top:=0;q[0]:=3*n+1;a[3*n+1]:=round(1e9);
        for i:=3*n downto 2*n+1 do
        begin
                tong:=tong+a[i];
                put1(i);
        end;
        r[2*n+1]:=tong;
        for i:=2*n downto n+1 do
        begin
                if a[i]<a[q[1]] then
                begin
                        u:=get1;
                        r[i]:=r[i+1]+a[i]-a[u];
                        put1(i);
                end else begin r[i]:=r[i+1];end;
        end;
        res:=-round(1e18);
        for i:=n to 2*n do
                if res<l[i]-r[i+1] then res:=l[i]-r[i+1];
        write(g,res);
        close(g);
end;
begin
        nhap;
        xl;
end.