#include <bits/stdc++.h>
using namespace std;
int n, d, a[100005];
struct UF {
  int par[200005], rank[200005];
  void init(int n) {
    for (int i = 0; i < n; i++) {
      par[i] = i;
      rank[i] = 0;
    }
  }
  int find(int x) {
    if (par[x] == x) return x;
    return par[x] = find(par[x]);
  }
  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    if (rank[x] < rank[y])
      par[x] = y;
    else {
      par[y] = x;
      if (rank[x] == rank[y]) rank[x]++;
    }
  }
  bool same(int x, int y) { return find(x) == find(y); }
} uf;
vector<pair<long long, pair<int, int> > > edge;
void solve(int l, int r) {
  if (l == r) return;
  int m = (l + r) / 2;
  long long mn = 2e18;
  int pl = -1;
  for (int i = l; i <= m; i++) {
    long long vl = a[i] - d * (long long)i;
    if (mn > vl) {
      mn = vl;
      pl = i;
    }
  }
  mn = 2e18;
  int pr = -1;
  for (int i = m + 1; i <= r; i++) {
    long long vl = a[i] + d * (long long)i;
    if (mn > vl) {
      mn = vl;
      pr = i;
    }
  }
  for (int i = 1; i <= m; i++) {
    long long vl = a[i] - d * (long long)i;
    long long vr = a[pr] + d * (long long)pr;
    edge.push_back(
        pair<long long, pair<int, int> >(vl + vr, pair<int, int>(i, pr)));
  }
  for (int i = m + 1; i <= r; i++) {
    long long vl = a[pl] - d * (long long)pl;
    long long vr = a[i] + d * (long long)i;
    edge.push_back(
        pair<long long, pair<int, int> >(vl + vr, pair<int, int>(pl, i)));
  }
  solve(l, m);
  solve(m + 1, r);
}
int main() {
  scanf("%d%d", &n, &d);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  solve(0, n - 1);
  sort(edge.begin(), edge.end());
  uf.init(n + 2);
  long long ret = 0;
  for (int i = 0; i < edge.size(); i++) {
    pair<int, int> p = edge[i].second;
    if (!uf.same(p.first, p.second)) {
      uf.unite(p.first, p.second);
      ret += edge[i].first;
    }
  }
  cout << ret;
  return 0;
}
