This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const int N = 1000000;
const ll INF = 1000000000000000000LL;
ll a[N+5];
ll dp[N+5];
struct line{
    ll k, n;
    ll eval(int x){ return k*x + n; }
} seg[4*N+5];
ll query(int node, int l, int r, int i){
    ll g = seg[node].eval(i);
    if(l == r) return g;
    int mid = (l+r)/2;
    if(i <= mid) return min(g, query(node*2, l, mid, i));
    return min(g, query(node*2+1, mid+1, r, i));
}
void upd(int node, int l, int r, line g){
    int mid = (l+r)/2;
    if(g.eval(mid) < seg[node].eval(mid)){
        swap(g, seg[node]);
    }
    if(l == r) return;
    if(seg[node].eval(l) > g.eval(l)) upd(node*2, l, mid, g);
    else upd(node*2+1, mid+1, r, g);
}
int main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    cout.precision(10);
    cout << fixed;
    int n;
    cin >> n;
    for(int i=1; i<=n; i++){
        cin >> a[i];
    }
    reverse(a+1, a+1+n);
    for(int i=1; i<=4*n; i++) seg[i].n = INF;
    vector <pair <int, int>> vec;
    for(int i=n; i>=1; i--){
        if(vec.empty() || vec.back().second < a[i]){
            vec.push_back({i, a[i]});
        }
    }
    reverse(vec.begin(), vec.end());
    for(int i=0; i<vec.size(); i++){
        int id, h;
        tie(id, h) = vec[i];
        line g;
        g.k = a[id];
        g.n = 0;
        if(i) g.n = dp[i-1];
        upd(1, 1, n, g);
        dp[i] = query(1, 1, n, id);
    }
    cout << dp[vec.size() - 1] << "\n";
    return 0;
}
Compilation message (stderr)
Discharging.cpp: In function 'int main()':
Discharging.cpp:55:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |     for(int i=0; i<vec.size(); i++){
      |                  ~^~~~~~~~~~~| # | 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... |