Language: C++

#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define DEBUG
#ifdef DEBUG
#define debug(...) __f(#__VA_ARGS__, __VA_ARGS__)
	template <typename Arg1>
	void __f(const char* name, Arg1&& arg1)
	{
		cerr << name << " = " << arg1 << endl;
	}
	template <typename Arg1, typename... Args>
	void __f(const char* names, Arg1&& arg1, Args&&... args)
	{
		const char* comma = strchr(names + 1, ','); cerr.write(names, comma - names) << " = " << arg1 << " || ";
		__f(comma+1, args...);
	}
#else
#define debug(...)
#endif

template <class Ch, class Tr, class Container>
basic_ostream <Ch, Tr> & operator << (basic_ostream <Ch, Tr> & os, Container const& x) {
    os << "{ ";
    for(auto& y : x) os << y << " ; ";
    return os << "}";
}

template <class X, class Y>
ostream & operator << (ostream & os, pair <X, Y> const& p) {
	return os << "[ " << p.first << ", " << p.second << "]" ;
}

#define FAST_IO std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long int
#define pb push_back
#define mp make_pair
#define ld long double
#define sz(a) (ll)(a).size()
#define endl "\n"

// priority_queue<ll, vector<ll>, less<ll>>pq;     // Max Heap
// priority_queue<ll, vector<ll>, greater<ll>>pq;  // Min Heap

typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
//K-th smallest
//cout << k << "kth (1 based indexing) smallest: " << *A.find_by_order(k - 1) << endl;
//NO OF ELEMENTS < X
//cout << "No of elements less than " << X << " are " << A.order_of_key(X) << endl;

int main()
{
	FAST_IO;

 	ll n, ans = -1e18;
 	cin >> n;
 	ll a[3*n], fr[3*n], ba[3*n];
 	multiset<ll>s;
 	for(int i=0;i<3*n;i++) cin >> a[i];
 	for(int i=0;i<3*n;i++)
 	{
 		if(sz(s) < n) 
 		{	
 			s.insert(a[i]);
 			if(i > 0) fr[i] = fr[i - 1] + a[i];
 			else fr[i] = a[i];
 		}
 		else
 		{
 			ll w = *s.begin();
 			fr[i] = fr[i - 1];
 			if(w >= a[i]) continue;
 			else
 			{
 				s.insert(a[i]);
 				s.erase(s.find(w));
 				fr[i] += a[i] - w;
 			}
 		}	
 	}
 	multiset<ll, greater<ll>>s1;
 	for(int i=3*n-1;i>=0;i--)
 	{
 		if(sz(s1) < n) 
 		{	
 			s1.insert(a[i]);
 			if(i < 3 * n - 1) ba[i] = ba[i + 1] + a[i];
 			else ba[i] = a[i];
 		}
 		else
 		{
 			ll w = *s1.begin();
 			ba[i] = ba[i + 1];
 			if(w <= a[i]) continue;
 			else
 			{
 				s1.insert(a[i]);
 				s1.erase(s1.find(w));
 				ba[i] += a[i] - w;
 			}
 		}	
 	}
 	for(int i=0;i<3*n;i++)
 	{
 		if(i >= n && i <= 2 * n)
 			ans = max(ans, fr[i - 1] - ba[i]);
 	}
 	cout << ans << endl;
    return 0;
}

Compiler output:
In file included from /usr/include/c++/14/string:43,
                 from /usr/include/c++/14/bitset:52,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:52,
                 from a.cc:5:
/usr/include/c++/14/bits/allocator.h: In destructor 'std::_Rb_tree<long long int, long long int, std::_Identity<long long int>, std::greater<long long int>, std::allocator<long long int> >::_Rb_tree_impl<std::greater<long long int>, true>::~_Rb_tree_impl()':
/usr/include/c++/14/bits/allocator.h:182:7: error: inlining failed in call to 'always_inline' 'std::allocator< <template-parameter-1-1> >::~allocator() noexcept [with _Tp = std::_Rb_tree_node<long long int>]': target specific option mismatch
  182 |       ~allocator() _GLIBCXX_NOTHROW { }
      |       ^
In file included from /usr/include/c++/14/map:62,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:152:
/usr/include/c++/14/bits/stl_tree.h:658:16: note: called from here
  658 |         struct _Rb_tree_impl
      |                ^~~~~~~~~~~~~