#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<ll,ll,ll> ti;
typedef vector<ll> li;
typedef vector<li> lii;
 
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
#define all(x) (x).begin(),(x).end()
 
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;
vector<ll> od,ev,val,tw;
vi p,s;
vector<pi> r;
vector<ti> a;
ll c=0;
int parent(int x){
  if(p[x]==x)return x;
  return p[x]=parent(p[x]);
}
void merge(int x,int y){
  x=parent(x);
  y=parent(y);
  if(x==y)return;
  if(s[x]<s[y])swap(x,y);
  s[x]+=s[y];
  c-=(val[x]+val[y]);
  p[y]=x;
  od[x]=min(od[x],od[y]);
  ev[x]=min(ev[x],ev[y]);
  tw[x]=min(tw[x],tw[y]);
  r[x]={min(r[x].F,r[y].F),max(r[x].S,r[y].S)};
  val[x]=get<2>(a[r[x].S])-(r[x].F-1>=0?get<2>(a[r[x].F-1]):0);
  if(s[x]%2==1){
    if(r[x].F%2==0)val[x]+=min(tw[x],ev[x]);
    else val[x]+=min(tw[x],od[x]);
  }
  c+=val[x];
}
std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) {
  int m=E.size();
  vector<pair<ll,int>> arr(m);
  REP(i,0,m)arr[i]={E[i],i};
  sort(all(arr));
  int n=W.size();
  a.resize(n);
  REP(i,0,n)a[i]={W[i],A[i],B[i]};
  sort(all(a));
  priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq,pq2;
  REP(i,0,n-1)pq.push({get<0>(a[i+1])-get<0>(a[i]),i});
  REP(i,0,n-2)pq2.push({get<0>(a[i+2])-get<0>(a[i]),i+1});
  p.resize(n);s.resize(n,1);r.resize(n);val.resize(n);tw.resize(n,INF);
  REP(i,0,n){
    p[i]=i;
    r[i]={i,i};
    val[i]=get<1>(a[i]);
  }
  od.resize(n,INF),ev.resize(n,INF);
  vector<ll> tmp(n);
  REP(i,0,n){
    if(i%2==0)ev[i]=get<1>(a[i])-get<2>(a[i]);
    else od[i]=get<1>(a[i])-get<2>(a[i]);
    tmp[i]=get<1>(a[i])-get<2>(a[i]);
  }
  REP(i,0,n)c+=(ll)A[i];
  vector<ll> ans(m,0);
  REP(i,1,n)get<2>(a[i])+=get<2>(a[i-1]);
  REP(i,0,m){
    ll D=arr[i].F;
    while(!pq2.empty()&&pq2.top().F<=D){
      auto [x,y]=pq2.top();
      pq2.pop();
      tw[parent(y)]=min(tw[parent(y)],tmp[y]);
    }
    while(!pq.empty()&&pq.top().F<=D){
      auto [x,y]=pq.top();
      pq.pop();
      merge(y,y+1);
    }
    ans[arr[i].S]=c;
  }
  return ans;
}
| # | 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... |