#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9 + 7;
const long long longinf = 1LL << 60;
const int mx = 200010;
const long long mod = 1e9 + 7;
template <typename T>
struct Kruskal {
  struct edge {
    int from, to;
    T cost;
    int used;
    edge(int from, int to, T cost) : from(from), to(to), cost(cost), used(0) {}
    bool operator<(const edge& e) const { return cost < e.cost; }
  };
  int n;
  vector<int> r, p;
  vector<edge> es;
  Kruskal() {}
  Kruskal(int n) : n(n), r(n, 1), p(n) { iota(p.begin(), p.end(), 0); }
  int find(int x) { return (x == p[x] ? x : p[x] = find(p[x])); }
  bool same(int x, int y) { return find(x) == find(y); }
  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    if (r[x] < r[y]) swap(x, y);
    r[x] += r[y];
    p[y] = x;
  }
  void add_edge(int u, int v, T c) { es.emplace_back(u, v, c); }
  T build() {
    sort(es.begin(), es.end());
    T res = 0;
    for (auto& e : es) {
      if (!same(e.from, e.to)) {
        res += e.cost;
        unite(e.from, e.to);
        e.used = 1;
      }
    }
    return res;
  }
};
vector<pair<pair<int, int>, long long>> edges;
vector<long long> a(mx);
int n, d;
long long dist(int x, int y) { return d * abs(x - y) + a[x] + a[y]; }
void dfs(int l, int r) {
  if (l + 1 >= r) {
    return;
  }
  long long mini = longinf, idx = -1;
  int m = (l + r) / 2;
  for (int i = l; i < m; i++) {
    if (dist(i, m) < mini) mini = dist(i, m), idx = i;
  }
  for (int i = m; i < r; i++) {
    edges.push_back({{idx, i}, dist(idx, i)});
  }
  mini = longinf;
  idx = -1;
  for (int i = m; i < r; i++) {
    if (dist(i, l) < mini) mini = dist(i, l), idx = i;
  }
  for (int i = l; i < m; i++) {
    edges.push_back({{idx, i}, dist(idx, i)});
  }
  dfs(l, m);
  dfs(m, r);
}
int main() {
  cin >> n >> d;
  for (int i = (int)(0); i < (int)(n); ++i) {
    cin >> a[i];
  }
  dfs(0, n);
  Kruskal<long long> ks(n);
  for (auto e : edges) {
    int u = e.first.first, v = e.first.second;
    long long c = e.second;
    ks.add_edge(v, u, c);
  }
  long long ans = ks.build();
  cout << ans << endl;
  return 0;
}
