#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int A[N];
int n, d;
long long ans;
int fa[N];
struct node {
  int x, y;
  long long v;
  node(int X = 0, int Y = 0, long long V = 0) {
    x = X;
    y = Y;
    v = V;
  }
};
vector<node> edge;
bool operator<(const node &a, const node &b) { return a.v < b.v; }
long long G(int x) { return A[x] + (long long)x * d; }
long long F(int x) { return A[x] - (long long)x * d; }
int getfa(int x) { return x == fa[x] ? x : fa[x] = getfa(fa[x]); }
int main() {
  scanf("%d %d", &n, &d);
  for (int i = 1; i <= n; i++) scanf("%d", &A[i]), fa[i] = i;
  int F_min = 1;
  for (int i = 2; i <= n; i++) {
    edge.push_back(node(F_min, i, F(F_min) + G(i)));
    if (F(F_min) > F(i)) F_min = i;
  }
  int G_min = n;
  for (int i = n - 1; i; i--) {
    edge.push_back(node(i, G_min, F(i) + G(G_min)));
    if (G(G_min) > G(i)) G_min = i;
  }
  sort(edge.begin(), edge.end());
  for (auto u : edge)
    if (getfa(u.x) != getfa(u.y)) {
      ans += u.v;
      fa[getfa(u.x)] = getfa(u.y);
    }
  printf("%lld\n", ans);
  return 0;
}
