#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const long long MOD = 1e9 + 7;
double EPS = 1e-8;
template <typename T>
struct SegTree {
  vector<T> dat;
  int n;
  const T Default;
  SegTree(int n_, const T& def) : Default(def) { init(n_); }
  void init(int n_) {
    n = 1;
    while (n < n_) n *= 2;
    dat = vector<T>(2 * n - 1, Default);
  }
  T f(const T& a, const T& b) { return min(a, b); }
  void update(int k, const T& a) {
    k += n - 1;
    dat[k] = a;
    while (k > 0) {
      k = (k - 1) / 2;
      dat[k] = f(dat[k * 2 + 1], dat[k * 2 + 2]);
    }
  }
  T query(int a, int b, int k, int l, int r) {
    if (r <= a || b <= l) return Default;
    if (a <= l && r <= b) return dat[k];
    T vector<long long> = query(a, b, k * 2 + 1, l, (l + r) / 2);
    T vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
    return f(vector<long long>, vr);
  }
  T query(int a, int b) { return query(a, b, 0, 0, n); }
};
struct UFT {
  int n;
  vector<int> d, r;
  UFT(int n) : n(n), d(n, -1), r(n, 0){};
  int root(int i) {
    if (d[i] < 0) return i;
    return d[i] = root(d[i]);
  }
  bool same(int x, int y) { return root(x) == root(y); }
  bool unite(int x, int y) {
    x = root(x);
    y = root(y);
    if (x == y) return false;
    if (r[x] < r[y])
      swap(x, y);
    else if (r[x] == r[y])
      r[x]++;
    d[x] += d[y];
    d[y] = x;
    return true;
  }
  int size(int i) { return -d[root(i)]; }
};
int main() {
  long long n, d;
  cin >> n >> d;
  vector<long long> a(n);
  for (int i = (0); i < (int)(n); i++) cin >> a[i];
  vector<long long> x(n), y(n);
  for (int i = (0); i < (int)(n); i++) {
    x[i] = a[i] + i * d;
    y[i] = a[i] - i * d;
  }
  using P = pair<long long, long long>;
  SegTree<P> st(n + 10, P(INF, INF));
  for (int i = (0); i < (int)(n); i++) st.update(i, P(y[i], i));
  UFT uf(n);
  long long ans = 0LL;
  int cnt = 0;
  using PP = pair<long long, P>;
  priority_queue<PP, vector<PP>, greater<PP> > q;
  for (int i = (1); i < (int)(n); i++) {
    auto p = st.query(0, i);
    q.push(PP(x[i] + p.first, P(i, p.second)));
  }
  while (!q.empty() && cnt < n - 1) {
    auto p = q.top();
    q.pop();
    auto i = p.second.first, j = p.second.second;
    auto cost = p.first;
    if (cost == INF) break;
    if (!uf.same(i, j)) {
      ans += cost;
      cnt++;
      uf.unite(i, j);
    }
    {
      st.update(j, P(INF, j));
      auto tmp = st.query(0, i);
      q.push(PP(x[i] + tmp.first, P(i, tmp.second)));
    }
  }
  cout << ans << endl;
  return 0;
}
