This documentation is automatically generated by online-judge-tools/verification-helper
#include<bits/stdc++.h>
using namespace std;
//BEGIN CUT HERE
// return sum of top K element (default: maximum)
template<typename T, T identity, typename V=vector<T>,
typename C1=less<T>, typename C2=greater<T> >
struct PrioritySum{
size_t num;
T sum;
priority_queue<T, V, C1> pq1;
priority_queue<T, V, C2> pq2;
PrioritySum():num(0),sum(identity){}
PrioritySum(size_t num):num(num),sum(identity){}
void resolve(){
assert(size()>=num);
while(pq2.size()<num){
sum+=pq1.top();
pq2.emplace(pq1.top());
pq1.pop();
}
while(pq2.size()>num){
sum-=pq2.top();
pq1.emplace(pq2.top());
pq2.pop();
}
if(pq1.empty() or pq2.empty()) return;
while(C2()(pq1.top(),pq2.top())){
T t1=pq1.top();pq1.pop();
T t2=pq2.top();pq2.pop();
sum+=t1;
sum-=t2;
pq1.emplace(t2);
pq2.emplace(t1);
}
}
T query(){resolve();return sum;}
void push(const T &x){pq1.emplace(x);}
void expand(){num++;}
void shrink(){assert(num);num--;}
size_t size()const{return pq1.size()+pq2.size();}
};
template<typename T>
using MaximumSum=PrioritySum<T, T(0), vector<T>, less<T>, greater<T> >;
template<typename T>
using MinimumSum=PrioritySum<T, T(0), vector<T>, greater<T>, less<T> >;
//END CUT HERE
struct FastIO{
FastIO(){
cin.tie(0);
ios::sync_with_stdio(0);
}
}fastio_beet;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
//INSERT ABOVE HERE
signed ARC074_D(){
using ll = long long;
int n;
cin>>n;
vector<ll> a(3*n);
for(int i=0;i<3*n;i++) cin>>a[i];
MaximumSum<ll> ps1(n);
vector<ll> dp1(3*n);
for(int i=0;i<3*n;i++){
if(i>=n) dp1[i]=ps1.query();
ps1.push(a[i]);
}
MinimumSum<ll> ps2(n);
vector<ll> dp2(3*n);
for(int i=3*n-1;i>=0;i--){
ps2.push(a[i]);
if(i<=2*n) dp2[i]=ps2.query();
}
ll ans=dp1[n]-dp2[n];
for(int i=n;i<=2*n;i++) chmax(ans,dp1[i]-dp2[i]);
cout<<ans<<endl;
return 0;
}
/*
verified on 2019/04/09
https://atcoder.jp/contests/arc074/tasks/arc074_b
*/
signed CGR002_F(){
using ll = long long;
using P = pair<ll, ll>;
int n;
cin>>n;
vector<vector<P> > G(n);
for(int i=1;i<n;i++){
ll a,b,c;
cin>>a>>b>>c;
a--;b--;
G[a].emplace_back(b,c);
G[b].emplace_back(a,c);
}
auto cmp=[&](P a,P b){
return G[a.first].size()>G[b.first].size();
};
for(auto &v:G)
sort(v.begin(),v.end(),cmp);
vector<vector<int> > alive(n),death(n);
for(int i=0;i<n;i++){
for(int j=0;j<=(int)G[i].size();j++)
alive[j].emplace_back(i);
death[G[i].size()].emplace_back(i);
}
vector<MinimumSum<ll> > ms(n);
vector<int> par(n,-1),cst(n,0),children(n,0);
auto dfs=
[&](int v,int p,auto func)->void{
for(auto e:G[v]){
ll u=e.first,c=e.second;
if(u==p) continue;
par[u]=v;
cst[u]=c;
children[v]++;
func(u,v,func);
}
};
dfs(0,-1,dfs);
const ll INF = 1e18;
vector<int> used(n,0),dead(n,0);
auto dfs2=
[&](int v,int p,int t,auto func)->P{
used[v]=1;
vector<ll> res;
ll sum=0;
for(auto e:G[v]){
ll u=e.first,c=e.second;
if(u==p) continue;
if(dead[u]) break;
P tmp=func(u,v,t,func);
sum+=tmp.second;
res.emplace_back((tmp.first+c)-tmp.second);
}
sort(res.begin(),res.end());
ll x=INF,y=INF,z=0;
int num=children[v]-t;
assert(num>=-1);
for(int i=0;i<=(int)res.size();i++){
int j=max(num-i,0);
if(j<=(int)ms[v].size()){
while((int)ms[v].num<j) ms[v].expand();
while((int)ms[v].num>j) ms[v].shrink();
chmin(x,sum+z+ms[v].query());
}
int k=max(num-i+1,0);
if(k<=(int)ms[v].size()){
while((int)ms[v].num<k) ms[v].expand();
while((int)ms[v].num>k) ms[v].shrink();
chmin(y,sum+z+ms[v].query());
}
if(i<(int)res.size()) z+=res[i];
}
return P(x,y);
};
for(int t=0;t<n;t++){
if(t) cout<<" ";
ll res=0;
for(int v:alive[t]){
if(used[v]) continue;
int u=v;
while(~par[u] and !dead[par[u]]) u=par[u];
P tmp=dfs2(u,par[u],t,dfs2);
res+=min(tmp.first+cst[u],tmp.second);
}
cout<<res;
for(int v:alive[t]) used[v]=0;
for(int v:death[t]){
dead[v]=1;
for(auto e:G[v])
if(e.first==par[v])
ms[e.first].push(e.second);
}
}
cout<<endl;
return 0;
}
/*
verified on 2019/04/10
https://codeforces.com/contest/1119/problem/F
*/
signed main(){
//ARC074_D();
//CGR002_F();
return 0;
}
#line 1 "datastructure/prioritysum.cpp"
#include<bits/stdc++.h>
using namespace std;
//BEGIN CUT HERE
// return sum of top K element (default: maximum)
template<typename T, T identity, typename V=vector<T>,
typename C1=less<T>, typename C2=greater<T> >
struct PrioritySum{
size_t num;
T sum;
priority_queue<T, V, C1> pq1;
priority_queue<T, V, C2> pq2;
PrioritySum():num(0),sum(identity){}
PrioritySum(size_t num):num(num),sum(identity){}
void resolve(){
assert(size()>=num);
while(pq2.size()<num){
sum+=pq1.top();
pq2.emplace(pq1.top());
pq1.pop();
}
while(pq2.size()>num){
sum-=pq2.top();
pq1.emplace(pq2.top());
pq2.pop();
}
if(pq1.empty() or pq2.empty()) return;
while(C2()(pq1.top(),pq2.top())){
T t1=pq1.top();pq1.pop();
T t2=pq2.top();pq2.pop();
sum+=t1;
sum-=t2;
pq1.emplace(t2);
pq2.emplace(t1);
}
}
T query(){resolve();return sum;}
void push(const T &x){pq1.emplace(x);}
void expand(){num++;}
void shrink(){assert(num);num--;}
size_t size()const{return pq1.size()+pq2.size();}
};
template<typename T>
using MaximumSum=PrioritySum<T, T(0), vector<T>, less<T>, greater<T> >;
template<typename T>
using MinimumSum=PrioritySum<T, T(0), vector<T>, greater<T>, less<T> >;
//END CUT HERE
struct FastIO{
FastIO(){
cin.tie(0);
ios::sync_with_stdio(0);
}
}fastio_beet;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
//INSERT ABOVE HERE
signed ARC074_D(){
using ll = long long;
int n;
cin>>n;
vector<ll> a(3*n);
for(int i=0;i<3*n;i++) cin>>a[i];
MaximumSum<ll> ps1(n);
vector<ll> dp1(3*n);
for(int i=0;i<3*n;i++){
if(i>=n) dp1[i]=ps1.query();
ps1.push(a[i]);
}
MinimumSum<ll> ps2(n);
vector<ll> dp2(3*n);
for(int i=3*n-1;i>=0;i--){
ps2.push(a[i]);
if(i<=2*n) dp2[i]=ps2.query();
}
ll ans=dp1[n]-dp2[n];
for(int i=n;i<=2*n;i++) chmax(ans,dp1[i]-dp2[i]);
cout<<ans<<endl;
return 0;
}
/*
verified on 2019/04/09
https://atcoder.jp/contests/arc074/tasks/arc074_b
*/
signed CGR002_F(){
using ll = long long;
using P = pair<ll, ll>;
int n;
cin>>n;
vector<vector<P> > G(n);
for(int i=1;i<n;i++){
ll a,b,c;
cin>>a>>b>>c;
a--;b--;
G[a].emplace_back(b,c);
G[b].emplace_back(a,c);
}
auto cmp=[&](P a,P b){
return G[a.first].size()>G[b.first].size();
};
for(auto &v:G)
sort(v.begin(),v.end(),cmp);
vector<vector<int> > alive(n),death(n);
for(int i=0;i<n;i++){
for(int j=0;j<=(int)G[i].size();j++)
alive[j].emplace_back(i);
death[G[i].size()].emplace_back(i);
}
vector<MinimumSum<ll> > ms(n);
vector<int> par(n,-1),cst(n,0),children(n,0);
auto dfs=
[&](int v,int p,auto func)->void{
for(auto e:G[v]){
ll u=e.first,c=e.second;
if(u==p) continue;
par[u]=v;
cst[u]=c;
children[v]++;
func(u,v,func);
}
};
dfs(0,-1,dfs);
const ll INF = 1e18;
vector<int> used(n,0),dead(n,0);
auto dfs2=
[&](int v,int p,int t,auto func)->P{
used[v]=1;
vector<ll> res;
ll sum=0;
for(auto e:G[v]){
ll u=e.first,c=e.second;
if(u==p) continue;
if(dead[u]) break;
P tmp=func(u,v,t,func);
sum+=tmp.second;
res.emplace_back((tmp.first+c)-tmp.second);
}
sort(res.begin(),res.end());
ll x=INF,y=INF,z=0;
int num=children[v]-t;
assert(num>=-1);
for(int i=0;i<=(int)res.size();i++){
int j=max(num-i,0);
if(j<=(int)ms[v].size()){
while((int)ms[v].num<j) ms[v].expand();
while((int)ms[v].num>j) ms[v].shrink();
chmin(x,sum+z+ms[v].query());
}
int k=max(num-i+1,0);
if(k<=(int)ms[v].size()){
while((int)ms[v].num<k) ms[v].expand();
while((int)ms[v].num>k) ms[v].shrink();
chmin(y,sum+z+ms[v].query());
}
if(i<(int)res.size()) z+=res[i];
}
return P(x,y);
};
for(int t=0;t<n;t++){
if(t) cout<<" ";
ll res=0;
for(int v:alive[t]){
if(used[v]) continue;
int u=v;
while(~par[u] and !dead[par[u]]) u=par[u];
P tmp=dfs2(u,par[u],t,dfs2);
res+=min(tmp.first+cst[u],tmp.second);
}
cout<<res;
for(int v:alive[t]) used[v]=0;
for(int v:death[t]){
dead[v]=1;
for(auto e:G[v])
if(e.first==par[v])
ms[e.first].push(e.second);
}
}
cout<<endl;
return 0;
}
/*
verified on 2019/04/10
https://codeforces.com/contest/1119/problem/F
*/
signed main(){
//ARC074_D();
//CGR002_F();
return 0;
}