#include <bits/stdc++.h>
using namespace std;
int par[200000];
int depth[200000];
void init(int n) {
  for (int i = 0; i < n; i++) {
    par[i] = i;
    depth[i] = 0;
  }
}
int root(int x) {
  if (par[x] == x) {
    return x;
  } else {
    return par[x] = root(par[x]);
  }
}
bool same(int x, int y) { return root(x) == root(y); }
void unite(int x, int y) {
  x = root(x);
  y = root(y);
  if (x == y) return;
  if (depth[x] < depth[y]) {
    par[x] = y;
  } else {
    par[y] = x;
    if (depth[x] == depth[y]) depth[x]++;
  }
}
struct edge {
  int from;
  int to;
  long long cost;
  edge(int f, int t, long long c) : from(f), to(t), cost(c){};
};
bool comp(edge e1, edge e2) { return e1.cost < e2.cost; }
int main() {
  int N;
  long long D;
  vector<edge> E;
  cin >> N >> D;
  init(N);
  vector<long long> A(N);
  for (int i = 0; i < N; i++) cin >> A[i];
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      edge e(i, j, abs(i - j) * D + A[i] + A[j]);
      E.push_back(e);
    }
  }
  sort(E.begin(), E.end(), comp);
  long long ans = 0;
  for (int i = 0; i < E.size(); i++) {
    edge e = E[i];
    if (!same(e.from, e.to)) {
      ans += e.cost;
      unite(e.from, e.to);
    }
  }
  cout << ans << endl;
  return 0;
}
