#include <bits/stdc++.h>
using namespace std;
struct edge {
  long long int u, v, cost;
};
bool comp(edge e1, edge e2) { return e1.cost < e2.cost; }
int p[200100];
int r[200100];
void init(int n) {
  for (int i = 0; i < n; i++) {
    p[i] = i;
    r[i] = 0;
  }
}
int find(int n) { return (p[n] == n ? n : p[n] = find(p[n])); }
void unite(int x, int y) {
  x = find(x);
  y = find(y);
  if (x == y) return;
  if (r[x] < r[y])
    p[x] = y;
  else {
    p[y] = x;
    if (r[x] == r[y]) r[x]++;
  }
}
bool same(int x, int y) { return (find(x) == find(y)); }
int main() {
  int n;
  cin >> n;
  long long int d;
  cin >> d;
  long long int a[n];
  for (int i = 0; i < n; i++) cin >> a[i];
  long long int ap[n], am[n];
  for (int i = 0; i < n; i++) {
    ap[i] = a[i] + d * i;
    am[i] = a[i] - d * i;
  }
  long long int pm[n], mm[n];
  mm[0] = 0;
  for (int i = 0; i < n - 1; i++) {
    if (am[i + 1] < am[mm[i]])
      mm[i + 1] = i + 1;
    else
      mm[i + 1] = mm[i];
  }
  pm[n - 1] = n - 1;
  for (int i = 0; i < n - 1; i++) {
    if (ap[n - 2 - i] < ap[pm[n - i - 1]])
      pm[n - 2 - i] = n - 2 - i;
    else
      pm[n - 2 - i] = pm[n - 1 - i];
  }
  vector<edge> e;
  for (int i = 0; i < n - 1; i++)
    e.push_back({mm[i], i + 1, ap[i + 1] + am[mm[i]]});
  for (int i = 0; i < n - 1; i++) {
    if (pm[n - 1 - i] > 0 && mm[pm[n - 1 - i] - 1] != n - 2 - i)
      e.push_back(
          {n - 2 - i, pm[n - 1 - i], ap[pm[n - 1 - i]] + am[n - 2 - i]});
  }
  int E = e.size();
  sort(e.begin(), e.end(), comp);
  init(n);
  long long int ans = 0;
  for (int i = 0; i < E; i++) {
    edge ex = e[i];
    if (!same(ex.u, ex.v)) {
      unite(ex.u, ex.v);
      ans += ex.cost;
    }
  }
  cout << ans << endl;
}
