#include <bits/stdc++.h>
using namespace std;
template <typename ty1, typename ty2>
inline int add(ty1 x, ty2 y) {
  if (y >= 998244353) y %= 998244353;
  if (x >= 998244353) x %= 998244353;
  x += y;
  return x < 998244353 ? x : x - 998244353;
}
template <typename ty1, typename ty2>
inline void addto(ty1 &x, ty2 y) {
  if (y >= 998244353) y %= 998244353;
  if (x >= 998244353) x %= 998244353;
  x += y;
  if (x >= 998244353) x -= 998244353;
}
template <typename ty1, typename ty2>
inline int sub(ty1 x, ty2 y) {
  if (y >= 998244353) y %= 998244353;
  if (x >= 998244353) x %= 998244353;
  x -= y;
  return x < 0 ? x + 998244353 : x;
}
template <typename ty1, typename ty2>
inline void subto(ty1 &x, ty2 y) {
  if (y >= 998244353) y %= 998244353;
  if (x >= 998244353) x %= 998244353;
  x -= y;
  if (x < 0) x += 998244353;
}
template <typename ty1, typename ty2>
inline int mul(ty1 x, ty2 y) {
  if (y >= 998244353) y %= 998244353;
  if (x >= 998244353) x %= 998244353;
  return 1ll * x * y % 998244353;
}
template <typename ty1, typename ty2>
void multo(ty1 &x, ty2 y) {
  if (y >= 998244353) y %= 998244353;
  if (x >= 998244353) x %= 998244353;
  x = 1ll * x * y % 998244353;
}
long long int ppow(long long int i, long long int j) {
  long long int res = 1LL;
  while (j) {
    if ((j & 1LL)) {
      res *= i;
      if (res >= 998244353) {
        res %= 998244353;
      }
    }
    j >>= 1;
    i *= i;
    if (i >= 998244353) {
      i %= 998244353;
    }
  }
  return res;
}
class Combination {
 public:
  vector<long long int> k;
  vector<long long int> r;
  void resize(int N) {
    k.resize(N + 2);
    r.resize(N + 2);
    k[0] = 1;
    for (int i = 1; i < N + 2; i++) {
      k[i] = k[i - 1];
      k[i] *= i;
      if (k[i] >= 998244353) k[i] %= 998244353;
    }
    long long int al = k[k.size() - 1];
    long long int iv = ppow(k[k.size() - 1], 998244353 - 2);
    r[k.size() - 1] = iv;
    for (int i = (int)(r.size()) - 2; i >= 0; i--) {
      r[i] = r[i + 1] * (i + 1);
      if (r[i] >= 998244353) {
        r[i] %= 998244353;
      }
    }
  }
  long long int C(int a, int b) {
    if (a < b) return 0;
    long long int up = k[a];
    long long int dw = r[b] * r[a - b];
    dw %= 998244353;
    up *= dw;
    up %= 998244353;
    return up;
  }
  long long int H(int a, int b) { return C(a + b - 1, b); }
  long long int catalan_number(int n) {
    return (C(2 * n, n) + 998244353 - C(2 * n, n - 1)) % 998244353;
  }
};
Combination C;
int n;
int d;
vector<long long int> v;
struct st {
  int a;
  int b;
  long long int c;
};
vector<st> ed;
bool cmp(st a, st b) { return a.c < b.c; }
void add_edge(int a, int b) {
  long long int cs = v[a] + v[b];
  cs += (long long int)(abs(b - a)) * d;
  ed.push_back({a, b, cs});
}
inline void dfs(int l, int r) {
  if (l + 1 == r) return;
  int mid = (l + r) / 2;
  pair<long long int, int> lef = {LLONG_MAX, -1};
  for (int i = l; i < mid; i++) {
    lef = min(lef, make_pair((long long int)(mid - i) * d + v[i], i));
  }
  pair<long long int, int> rig = {LLONG_MAX, -1};
  for (int i = mid; i < r; i++) {
    rig = min(rig, make_pair((long long int)(i - mid) * d + v[i], i));
  }
  for (int i = l; i < mid; i++) {
    add_edge(i, rig.second);
  }
  for (int i = mid; i < r; i++) {
    add_edge(lef.second, i);
  }
  dfs(l, mid);
  dfs(mid, r);
}
struct UF {
  vector<int> belong;
  vector<int> size;
  void resize(int n) {
    belong.assign(n + 1, -1);
    size.assign(n + 1, 1);
  }
  inline int root(int b) {
    if (belong[b] == -1) {
      return b;
    }
    belong[b] = root(belong[b]);
    return belong[b];
  }
  void merge(int a, int b) {
    a = root(a);
    b = root(b);
    if (a == b) return;
    belong[a] = b;
    size[b] += size[a];
  }
};
UF uf;
int main() {
  cin >> n >> d;
  for (int i = 0; i < n; i++) {
    int a;
    scanf("%d", &a);
    v.push_back(a);
  }
  dfs(0, v.size());
  sort(ed.begin(), ed.end(), cmp);
  uf.resize(v.size());
  long long int ans = 0;
  for (auto el : ed) {
    int a = el.a;
    int b = el.b;
    long long int c = el.c;
    if (uf.root(a) != uf.root(b)) {
      ans += c;
      uf.merge(a, b);
    }
  }
  printf("%lld\n", ans);
  return 0;
}
