#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef long double Double;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

ll N;
ll D;
vector<pair<ll, ll>> A;

struct UnionFind {
    vector<int> data;

    UnionFind(int size) : data(size, -1) {}

    UnionFind() {}

    bool unionSet(int x, int y) {
        x = root(x);
        y = root(y);
        if (x != y) {
            if (data[y] < data[x]) swap(x, y);
            data[x] += data[y];
            data[y] = x;
            //cout << x << " " << y << endl;
        }
        return x != y;
    }

    bool findSet(int x, int y) {
        return root(x) == root(y);
    }

    int root(int x) {
        return data[x] < 0 ? x : data[x] = root(data[x]);
    }

    int size(int x) {
        return -data[root(x)];
    }
};


UnionFind uf;

set<pair<ll, ll> > S;

void add(ll x, ll v, ll dsum) {
    S.insert({v - dsum, A[x].second});
}

long long INF = 1e18;

pair<ll, ll> find_min(ll x, ll dsum) {
    pair<ll, ll> r;
    auto it = S.begin();
    while (it != S.end()) {
        if (uf.findSet(A[x].second, it->second)) {
            ++it;
        } else {
            r = *it;
            break;
        }
    }
//    hoge[uf.root(A[x].second)] = it;
    if (it == S.end()) return {INF, INF};
    return {r.first + dsum + A[x].first, r.second};
}

void init() {
    S.clear();
}

bool one_step(ll &ans) {
    init();
    vector<pair<ll,pair<ll, ll>>> seq;

    for (int i = 0; i < A.size(); i++) {
        auto r = find_min(i, i * D);
        seq.emplace_back(r.first, r.second, i);
        add(i, A[i].first, i * D);
    }

    init();
    reverse(A.begin(), A.end());
    {
        for (int i = 0; i < A.size(); i++) {
            auto r = find_min(i, i * D);
            seq.emplace_back(r.first, A[i].second, r.second);
            add(i, A[i].first, i * D);
        }
    }
    reverse(A.begin(), A.end());

    sort(seq.begin(), seq.end());
    for(auto i : seq ){
        if( uf.findSet(i.second.))
    }
    return false;
}

void fake_solve() {

    uf = UnionFind(N);
    ll ans = 0;
    while (true) {
        if (!one_step(ans)) break;
        //cout << "===" << endl;
    }
    cout << ans << endl;


}

void solve() {
    fake_solve();

//  UnionFind uf(N);
//  int ans = 0;
//  while(true) {
//    vector<pair<int, pair<int, int>>> es[N];
//    for (int i = 0; i < N; i++) {
//      for (int j = 0; j < N; j++) {
//        if (i != j && uf.findSet(i, j) == 0) {
//          es[uf.root(i)].push_back({abs(i - j) * D + A[i] + A[j], {i, j}});
//        }
//      }
//    }
//    bool upd = false;
//    for(int i = 0 ; i < N ; i++){
//      if( uf.root(i) == i ){
//        sort(es[i].begin(), es[i].end());
//        if( es[i].size() > 0 ){
//          ans += es[i].front().first;
//          uf.unionSet(es[i].front().second.first, es[i].front().second.second);
//          cout << es[i].front().second.first << "-"  << es[i].front().second.second << endl;
//          upd = true;
//        }
//      }
//    }
//    cout << "====" << endl;
//    if(!upd) break;
//  }

//  int ans = 0;
//  for(int i = 0 ; i < es.size() ; i++){
//    if( uf.unionSet(es[i].second.first, es[i].second.second)){
//      cout << es[i].second.first << " " << es[i].second.second << endl;
//      ans += es[i].first;
//    }
//  }
//    cout << ans << endl;


    //cout << "No submit" << endl;
}

void input() {
    N = ll();
    scanf("%lld", &N);
    D = ll();
    scanf("%lld", &D);
    A = vector<pair<ll, ll>>(N);
    for (int i = 0; i < N; i++) {
        scanf("%lld", &A[i].first);
        A[i].second = i;
    }
}

int main() {
    input();
    solve();
    return 0;
}
