#include <bits/stdc++.h>
using namespace std;
long long qmin(long long a, long long b) { return (a < b) ? a : b; }
long long n, d;
long long a[200200];
vector<pair<long long, pair<long long, long long> > > edge;
void solve(int l, int r) {
  if (l >= r) return;
  int mid = (l + r) >> 1;
  solve(l, mid);
  solve(mid + 1, r);
  int mnpos1 = l;
  for (int i = l; i <= mid; i++) {
    if (a[i] + (i - mid) * d < a[mnpos1] + (mnpos1 - mid) * d) mnpos1 = i;
  }
  long long mnpos2 = mid + 1;
  for (int i = mid + 1; i <= r; i++) {
    if (a[i] + (i - mid) * d < a[mnpos2] + (mnpos2 - mid) * d) mnpos2 = i;
  }
  for (int i = l; i <= mid; i++)
    edge.push_back(
        make_pair(a[mnpos2] + a[i] + (mnpos2 - i) * d, make_pair(i, mnpos2)));
  for (int i = mid + 1; i <= r; i++)
    edge.push_back(
        make_pair(a[i] + a[mnpos1] + (i - mnpos1) * d, make_pair(i, mnpos1)));
}
int par[200200];
int get_par(int now) {
  return par[now] = ((par[now] == now) ? now : get_par(par[now]));
}
void unite(int a, int b) { par[get_par(a)] = get_par(b); }
long long ans = 0;
int main() {
  scanf("%lld%lld", &n, &d);
  for (int i = 0; i < n; i++) par[i] = i;
  for (int i = 0; i < n; i++) scanf("%lld", &a[i]);
  solve(0, n - 1);
  sort(edge.begin(), edge.end());
  for (int i = 0; i < edge.size(); i++) {
    if (get_par(edge[i].second.first) != get_par(edge[i].second.second)) {
      ans += edge[i].first;
      unite(edge[i].second.first, edge[i].second.second);
    }
  }
  cout << ans << endl;
  return 0;
}
