#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define ll long long
const int N = 1<<17;
ll dp[N][2];
vector<ll> sub1(int n, vector<int> U, vector<int> V, vector<int> W){
sort(rbegin(W), rend(W));
vector<ll> Ans(n, 0);
for (int i : W)
Ans[0] += i;
for (int i=1;i<=W.size();i++)
Ans[i] = Ans[i-1] - W[i-1];
return Ans;
}
vector<ll> sub2(int n, vector<int> U, vector<int> V, vector<int> W){
vector<ll> Ans(n, 0);
for (int i : W)
Ans[0] += i;
for (int i=1;i<n;i++){
dp[i][1] = dp[i-1][0];
dp[i][0] = min(dp[i-1][0], dp[i-1][1]) + W[i-1];
}
Ans[1] = min(dp[n-1][0], dp[n-1][1]);
return Ans;
}
vector<ll> minimum_closure_costs(int n, vector<int> U, vector<int> V, vector<int> W){
bool t = 1;
for (int i=0;i<n-1;i++)
t &= U[i] == 0;
if (t)
return sub1(n, U, V, W);
return sub2(n, U, V, W);
}