#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll res = 0;
struct DSU
{
vector<ll>e;
vector<ll>vis;
void init(ll n)
{
e.resize(n+1, -1);
vis.resize(n+1, 0);
}
ll find (ll x)
{
if (e[x]<0)
return x;
return e[x] = find(e[x]);
}
bool merge(ll x, ll y)
{
ll a = find(x);
ll b = find(y);
if (a==b)
return false;
if (e[a]>e[b])
swap(a, b);
ll a1 = -e[a];
ll b1 = -e[b];
res -= (a1+(a1%2));
res -= (b1+(b1%2));
b1 += a1;
res += b1+(b1%2);
e[a]+=e[b];
e[b] = a;
return true;
}
};
std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A,
std::vector<int> B, std::vector<int> E) {
map<ll, vector<ll>>mp;
set<ll>acc;
for (int i=0 ; i<E.size() ; i++)
{ mp[E[i]].push_back(i); acc.insert(E[i]);}
DSU dsu;
ll n = W.size();
dsu.init(n);
sort(W.begin(), W.end());
map<ll, vector<ll>>mp1;
for (int i=1 ; i<n ;i ++)
{
mp1[W[i]-W[i-1]].push_back(i-1);
acc.insert(W[i]-W[i-1]);
}
res = 2*n;
ll sz = E.size();
vector<ll>out(sz);
for (auto i:acc)
{
for (auto j:mp1[i])
dsu.merge(j, j+1);
for (auto j:mp[i])
out[j] = res;
}
return out;
}