#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T>
inline bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
};
template <class T>
inline bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
};
const int INF = 1e9;
const long long INFLL = 1e18;
void iosetup() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  cerr << fixed << setprecision(10);
}
using pii = pair<int, int>;
template <typename T>
struct SparseTable {
  vector<vector<T> > st;
  vector<int> lookup;
  SparseTable(const vector<T> &v) {
    int b = 0;
    while ((1 << b) <= v.size()) ++b;
    st.assign(b, vector<T>(1 << b));
    for (int i = 0; i < v.size(); i++) {
      st[0][i] = v[i];
    }
    for (int i = 1; i < b; i++) {
      for (int j = 0; j + (1 << i) <= (1 << b); j++) {
        st[i][j] = min(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
      }
    }
    lookup.resize(v.size() + 1);
    for (int i = 2; i < lookup.size(); i++) {
      lookup[i] = lookup[i >> 1] + 1;
    }
  }
  inline T rmq(int l, int r) {
    int b = lookup[r - l];
    return min(st[b][l], st[b][r - (1 << b)]);
  }
};
struct UnionFind {
  vector<int> data;
  UnionFind(int sz) { data.assign(sz, -1); }
  bool unite(int x, int y) {
    x = find(x), y = find(y);
    if (x == y) return (false);
    if (data[x] > data[y]) swap(x, y);
    data[x] += data[y];
    data[y] = x;
    return (true);
  }
  int find(int k) {
    if (data[k] < 0) return (k);
    return (data[k] = find(data[k]));
  }
  int size(int k) { return (-data[find(k)]); }
  bool same(int x, int y) { return find(x) == find(y); }
};
int main() {
  iosetup();
  int N, D;
  cin >> N >> D;
  vector<int> A(N);
  for (int i = 0; i < N; i++) cin >> A[i];
  vector<pii> le(N), ri(N);
  for (int i = 0; i < N; i++) le[i] = {A[i] - D * i, i};
  for (int i = 0; i < N; i++) ri[i] = {A[i] + D * i, i};
  SparseTable<pii> sl(le), sr(ri);
  UnionFind uf(N);
  int ans = 0;
  for (int i = 0; i < N; i++) {
    pii p(INF, INF), q(INF, INF);
    if (0 < i) {
      p = sl.rmq(0, i);
      p.first += i * D + A[i];
    }
    if (i + 1 < N) {
      q = sr.rmq(i + 1, N);
      q.first += -i * D + A[i];
    }
    chmin(p, q);
    if (uf.same(i, p.second)) continue;
    uf.unite(i, p.second);
    ans += p.first;
  }
  int l = 0;
  while (l < N and uf.find(0) == uf.find(l)) ++l;
  while (l < N) {
    int r = l + 1;
    while (r < N and uf.find(l) == uf.find(r)) ++r;
    int p = sl.rmq(0, l).second;
    int q = sr.rmq(l, r).second;
    ans += abs(p - q) * D + A[p] + A[q];
    l = r;
  }
  cout << ans << endl;
  return 0;
}
