#include <bits/stdc++.h>
using namespace std;
template <class S, class T>
pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) {
  return pair<S, T>(s.first + t.first, s.second + t.second);
}
template <class S, class T>
pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) {
  return pair<S, T>(s.first - t.first, s.second - t.second);
}
template <class S, class T>
ostream &operator<<(ostream &os, pair<S, T> p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
const long long inf = 1000000001;
const long long INF = 1e18;
const long long MOD = 1000000007;
const double pi = 3.14159265358979323846;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
int dx2[8] = {1, 1, 0, -1, -1, -1, 0, 1}, dy2[8] = {0, 1, 1, 1, 0, -1, -1, -1};
class UnionFind {
 public:
  int n;
  vector<int> par;
  vector<int> ran;
  vector<int> num;
  UnionFind(int _n) {
    n = _n;
    par.resize(n);
    ran.resize(n);
    num.resize(n);
    for (int i = 0; i < n; i++) {
      par[i] = i;
      ran[i] = 0;
      num[i] = 1;
    }
  }
  int find(int x) {
    if (par[x] == x) {
      return x;
    } else {
      return par[x] = find(par[x]);
    }
  }
  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    int numsum = num[x] + num[y];
    if (x == y) {
      return;
    }
    if (ran[x] < ran[y]) {
      par[x] = y;
    } else {
      par[y] = x;
      if (ran[x] == ran[y]) {
        ran[x]++;
      }
    }
    num[x] = num[y] = numsum;
  }
  bool same(int x, int y) { return find(x) == find(y); }
};
vector<long long> a(200020);
vector<pair<long long, pair<long long, long long> > > edges;
long long kruskal(int n) {
  sort(edges.begin(), edges.end());
  vector<bool> used(n);
  UnionFind uf(n);
  long long res = 0;
  for (int i = 0; i < edges.size(); i++) {
    if (!uf.same(edges[i].second.first, edges[i].second.second)) {
      uf.unite(edges[i].second.first, edges[i].second.second);
      res += edges[i].first;
      used[i] = true;
    }
  }
  return res;
}
void solve(int l, int r, long long d) {
  if (r - l <= 1) return;
  int m = (l + r) / 2;
  long long mi1 = INF, mi2 = INF;
  int mii1 = -1, mii2 = -1;
  for (int i = l; i < m; i++) {
    if (mi1 > a[i] - d * i) {
      mi1 = a[i] - d * i;
      mii1 = i;
    }
  }
  for (int i = m; i < r; i++) {
    if (mi2 > a[i] + d * i) {
      mi2 = a[i] + d * i;
      mii2 = i;
    }
  }
  for (int i = l; i < m; i++) {
    edges.push_back({a[i] + a[mii2] + (mii2 - i) * d, pair<int, int>(i, mii2)});
  }
  for (int i = m; i < r; i++) {
    edges.push_back({a[i] + a[mii1] + (i - mii1) * d, pair<int, int>(mii1, i)});
  }
  solve(l, m, d);
  solve(m, r, d);
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  ;
  long long n, d;
  cin >> n >> d;
  for (int i = 0; i < (n); i++) {
    cin >> a[i];
  }
  solve(0, n, d);
  cout << kruskal(n) << endl;
}
