#include <bits/stdc++.h>
using namespace std;
vector<pair<long, pair<long, long> > > edge;
long long N, D;
vector<long long> A;
const long INF = (1L << 50);
class UF {
  vector<int> par, rank;

 public:
  UF(int size) {
    for (int i = 0; i < size; i++) {
      par.push_back(i);
      rank.push_back(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); }
};
void solve(long l, long r) {
  if (l == r) return;
  long m = (l + r) / 2;
  long mn = INF;
  int pl = -1;
  for (long i = l; i <= m; i++) {
    long vl = A[i] - D * i;
    if (mn > vl) {
      mn = vl;
      pl = i;
    }
  }
  long pr = -1;
  mn = INF;
  for (long i = m + 1; i <= r; i++) {
    long vr = A[i] + D * i;
    if (mn > vr) {
      mn = vr;
      pr = i;
    }
  }
  for (long i = 0; i <= m; i++) {
    edge.push_back(pair<long, pair<long, long> >(A[i] + A[pr] + D * (pr - i),
                                                 pair<long, long>(i, pr)));
  }
  for (long i = m + 1; i < r + 1; i++) {
    edge.push_back(pair<long, pair<long, long> >(A[i] + A[pl] + D * (i - pl),
                                                 pair<long, long>(pl, i)));
  }
  solve(0, m);
  solve(m + 1, r);
  return;
}
int main() {
  scanf("%lld", &N);
  scanf("%lld", &D);
  for (int i = 0; i < N; i++) {
    long long tmp;
    scanf("%lld", &tmp);
    A.push_back(tmp);
  }
  solve(0, N - 1);
  sort(edge.begin(), edge.end());
  UF uf(N);
  long ret = 0;
  for (auto tmp : edge) {
    pair<long, long> p = tmp.second;
    if (!uf.same(p.first, p.second)) {
      uf.unite(p.first, p.second);
      ret += tmp.first;
    }
  }
  cout << ret << endl;
  return 0;
}
