#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
int goDSU(int a, vector<int> &DSU){
  if (DSU[a] == a)
    return a;
  DSU[a] = goDSU(DSU[a], DSU);
  return DSU[a];
}
vector<long long> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E) {
  int Q = (int)E.size(), N = W.size();
  vector<long long> R(Q, 0);
  vector<array<int, 3>> artifacts(N);
  vector<array<int, 2>> query(Q);
  for (int i = 0; i < N; i++){
    artifacts[i][0] = W[i];
    artifacts[i][1] = B[i];
    artifacts[i][2] = A[i] - B[i];
  }
  for (int i = 0; i < Q; i++){
    query[i][0] = E[i];
    query[i][1] = i;
  }
  sort(all(artifacts));
  sort(all(query));
  priority_queue<array<int, 2>> pque;
  vector<int> DSU(N);
  vector<int> unused(N);
  vector<int> mincift(N, INT_MAX);
  vector<int> mintek(N);
  vector<int> usablemin(N, INT_MAX);
  vector<int> sz(N, 1);
  long long ret = 0;
  for (int i = 0; i < N; i++){
    DSU[i] = i;
    unused[i] = artifacts[i][2];
    mintek[i] = artifacts[i][2];
    ret += artifacts[i][1] + artifacts[i][2];
    if (i){
      pque.push({ -artifacts[i][0] + artifacts[i - 1][0], i });
      if (i != N - 1)
        pque.push({ -artifacts[i + 1][0] + artifacts[i - 1][0], -i });
    }
  }
  for (int q = 0; q < Q; q++){
    while (pque.size() && -pque.top()[0] <= query[q][0]){
      if (pque.top()[1] < 0){
        int i = pque.top()[1] * -1;
        usablemin[goDSU(i, DSU)] = min(usablemin[goDSU(i, DSU)], artifacts[i][2]);
        if (unused[goDSU(i, DSU)] && unused[goDSU(i, DSU)] > usablemin[goDSU(i, DSU)]){
          ret -= unused[goDSU(i, DSU)];
          unused[goDSU(i, DSU)] = usablemin[goDSU(i, DSU)];
          ret += unused[goDSU(i, DSU)];
        }
        pque.pop();
        continue;
      }
      ret -= unused[goDSU(pque.top()[1], DSU)] + unused[goDSU(pque.top()[1] - 1, DSU)];
      unused[goDSU(pque.top()[1] - 1, DSU)] = 0;
      unused[goDSU(pque.top()[1], DSU)] = 0;
      if (sz[goDSU(pque.top()[1] - 1, DSU)] % 2){
        mintek[goDSU(pque.top()[1], DSU)] = min(mintek[goDSU(pque.top()[1], DSU)], mincift[mintek[goDSU(pque.top()[1] - 1, DSU)]]);
        mincift[goDSU(pque.top()[1], DSU)] = min(mincift[goDSU(pque.top()[1], DSU)], mintek[mintek[goDSU(pque.top()[1] - 1, DSU)]]);
      }else{
        mintek[goDSU(pque.top()[1], DSU)] = min(mintek[goDSU(pque.top()[1] - 1, DSU)], mintek[goDSU(pque.top()[1], DSU)]);
        mincift[goDSU(pque.top()[1], DSU)] = min(mincift[goDSU(pque.top()[1] - 1, DSU)], mincift[goDSU(pque.top()[1], DSU)]);
      }
      sz[goDSU(pque.top()[1], DSU)] += sz[goDSU(pque.top()[1] - 1, DSU)];
      if (sz[goDSU(pque.top()[1], DSU)] % 2){
        unused[goDSU(pque.top()[1], DSU)] = min(usablemin[goDSU(pque.top()[1], DSU)], mintek[goDSU(pque.top()[1], DSU)]);
        ret += unused[goDSU(pque.top()[1], DSU)];
      }
      DSU[goDSU(pque.top()[1] - 1, DSU)] = goDSU(pque.top()[1], DSU);
      pque.pop();
    }
    R[query[q][1]] = ret;
  }
  return R;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |