#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define lc id<<1
#define rc lc|1
#define mid ((l+r)>>1)
#define mins(a, b) (a = min(a, b))
const int MXN = 750005;
int n;
inline int rev(int i) { return n-1-i; }
struct node {
    ll gl, lz_add, lz_set;
    bool flag_set;
    node(): gl(0), lz_add(0), lz_set(0), flag_set(0) {}
};
inline void apply_set(node &v, ll x, int l) {
    v.gl = x*l;
    v.lz_add = 0;
    v.lz_set = x;
    v.flag_set = 1;
}
inline void apply_add(node &v, ll x) {
    v.gl += x;
    v.lz_add += x;
}
struct DS {
    node seg[MXN<<2];
    inline void push(int l, int r, int id) {
        if(seg[id].flag_set) {
            apply_set(seg[lc], seg[id].lz_set, l);
            apply_set(seg[rc], seg[id].lz_set, mid);
            seg[id].flag_set = 0;
        }
        if(seg[id].lz_add) {
            apply_add(seg[lc], seg[id].lz_add);
            apply_add(seg[rc], seg[id].lz_add);
            seg[id].lz_add = 0;
        }
    }
    void upd_set(int s, int e, ll x, int l=0, int r=n, int id=1) {
        if(s>=r || l>=e) return;
        if(s<=l && r<=e) {
            apply_set(seg[id], x, l);
            return;
        }
        push(l, r, id);
        upd_set(s, e, x, l, mid, lc);
        upd_set(s, e, x, mid, r, rc);
        seg[id].gl = seg[lc].gl;
    }
    void upd_add(int s, int e, ll x, int l=0, int r=n, int id=1) {
        if(s>=r || l>=e) return;
        if(s<=l && r<=e) {
            apply_add(seg[id], x);
            return;
        }
        push(l, r, id);
        upd_add(s, e, x, l, mid, lc);
        upd_add(s, e, x, mid, r, rc);
        seg[id].gl = seg[lc].gl;
    }
    ll get(int p, int l=0, int r=n, int id=1) {
        if(r-l == 1) return seg[id].gl;
        push(l, r, id);
        return p<mid ? get(p, l, mid, lc) : get(p, mid, r, rc);
    }
    int res;
    void find_(int s, int e, ll A, ll B, ll C, int l=0, int r=n, int id=1) {
        if(s>=r || l>=e || res!=s-1) return;
        if(s<=l && r<=e) {
            if(seg[id].gl+C<A+B*l) return;
            if(r-l==1) {
                res = l;
                return;
            }
            push(l, r, id);
            if(seg[rc].gl+C>=A+B*mid) find_(s, e, A, B, C, mid, r, rc);
            else find_(s, e, A, B, C, l, mid, lc);
            return;
        }
        push(l, r, id);
        find_(s, e, A, B, C, mid, r, rc);
        find_(s, e, A, B, C, l, mid, lc);
    }
    int find(int s, int e, ll A, ll B, ll C) {
        res = s-1;
        find_(s, e, A, B, C);
        return res;
    }
} pre, suf;
pii seg[MXN<<2];
void build(vector<int> &H, int l=0, int r=n, int id=1) {
    if(r-l == 1) {
        seg[id] = pii(H[l], l);
        return;
    }
    build(H, l, mid, lc);
    build(H, mid, r, rc);
    seg[id] = max(seg[lc], seg[rc]);
}
pii get_max(int s, int e, int l=0, int r=n, int id=1) {
    if(s>=r || l>=e) return pii(0, 0);
    if(s<=l && r<=e) return seg[id];
    return max(get_max(s, e, l, mid, lc), get_max(s, e, mid, r, rc));
}
int L[MXN], R[MXN], ord[MXN];
vector<ll> ans;
vector<int> Q[MXN];
vector<ll> minimum_costs(vector<int> H, vector<int> ql, vector<int> qr) {
    n = H.size();
    for(int i=0; i<n; i++)
        for(L[i]=i-1; L[i]>=0 && pii(H[L[i]], L[i])<pii(H[i], i); L[i]=L[L[i]]);
    for(int i=n-1; i>=0; i--)
        for(R[i]=i+1; R[i]<n && pii(H[R[i]], R[i])<pii(H[i], i); R[i]=R[R[i]]);
    build(H);
    for(int i=0; i<ql.size(); i++)
        Q[get_max(ql[i], qr[i]+1).second].push_back(i);
    ans = vector<ll>(ql.size(), 1e18);
    iota(ord, ord+n, 0);
    sort(ord, ord+n, [&](int i, int j) {
        return pii(H[i], i) < pii(H[j], j);
    });
    for(int _=0,i; _<n; _++) {
        i = ord[_];
        for(int j : Q[i]) {
            mins(ans[j], 1ll*(qr[j]-ql[j]+1)*H[i]);
            mins(ans[j], pre.get(qr[j]) + 1ll*(i-ql[j]+1)*H[i]);
            mins(ans[j], suf.get(rev(ql[j])) + 1ll*(qr[j]-i+1)*H[i]);
        }
        pre.upd_add(i, i+1, L[i]==i-1 ? H[i] : pre.get(i-1)+H[i]);
        if(R[i]>i+1) {
            ll A = pre.get(i)-1ll*i*H[i];
            int wh = pre.find(i+1, R[i], A, H[i], 1ll*(i-L[i])*H[i]);
            pre.upd_set(i+1, wh+1, H[i]);
            pre.upd_add(i+1, wh+1, A);
            pre.upd_add(wh+1, R[i], 1ll*(i-L[i])*H[i]);
        }
        suf.upd_add(rev(i), rev(i)+1, R[i]==i+1 ? H[i] : suf.get(rev(i+1))+H[i]);
        if(L[i]<i-1) {
            ll A = suf.get(rev(i))-1ll*rev(i)*H[i];
            int wh = suf.find(rev(i-1), rev(L[i]), A, H[i], 1ll*(R[i]-i)*H[i]);
            suf.upd_set(rev(i-1), wh+1, H[i]);
            suf.upd_add(rev(i-1), wh+1, A);
            suf.upd_add(wh+1, rev(L[i]), 1ll*(R[i]-i)*H[i]);
        }
    }
    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... |