#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v;
  long long val;
  edge() {}
  edge(int u, int v, long long val) {
    this->u = u;
    this->v = v;
    this->val = val;
  }
};
int n, d, w[200005], pr[200005];
long long ans;
vector<edge> dat;
bool cmp(edge a, edge b) { return a.val < b.val; }
int find_pr(int a) { return pr[a] == a ? a : pr[a] = find_pr(pr[a]); }
void solve(int l, int r) {
  if (l == r) return;
  int mid = (l + r) >> 1, pl = 0, pr = 0;
  long long ml = 5e18, mr = 5e18;
  for (int i = l; i <= mid; ++i) {
    int cur = w[i] - d * i;
    if (cur < ml) {
      pl = i;
      ml = cur;
    }
  }
  for (int i = mid + 1; i <= r; ++i) {
    int cur = w[i] + d * i;
    if (cur < mr) {
      pr = i;
      mr = cur;
    }
  }
  for (int i = mid + 1; i <= r; ++i) {
    dat.push_back(edge(pl, i, ml + w[i] + d * i));
  }
  for (int i = l; i <= mid; ++i) {
    dat.push_back(edge(i, pr, mr + w[i] - d * i));
  }
  solve(l, mid);
  solve(mid + 1, r);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> d;
  for (int i = 1; i <= n; ++i) {
    cin >> w[i];
  }
  solve(1, n);
  sort(dat.begin(), dat.end(), cmp);
  for (int i = 1; i <= n; ++i) {
    pr[i] = i;
  }
  for (int i = 0; i < dat.size(); ++i) {
    int u = dat[i].u, v = dat[i].v, pu = find_pr(u), pv = find_pr(v);
    long long val = dat[i].val;
    if (pu == pv) continue;
    pr[pv] = pu;
    ans += val;
  }
  cout << ans << endl;
}
