#include <bits/stdc++.h>
typedef struct city_t {
  int scale;
  int pos;
  int reachable;
} CITY;
typedef struct road_t {
  int a;
  int b;
} ROAD;
int qsort_compare_road(const void *a, const void *b) {
  return (*(ROAD *)a).a - (*(ROAD *)b).a;
}
int main(int argc, char *argv[]) {
  CITY city[200000];
  ROAD road[200000 - 1];
  int n, d;
  int i, j;
  long long minscore, minpos;
  long long score;
  long long score_sum;
  int n_road;
  scanf("%d %d", &n, &d);
  for (i = 0; i < n; i++) {
    city[i].pos = i;
    scanf("%d", &city[i].scale);
    city[i].reachable = 0;
  }
  n_road = 0;
  score_sum = 0;
  for (i = 0; i < n; i++) {
    if (city[i].reachable) {
      continue;
    }
    minscore = LLONG_MAX;
    minpos = -1;
    for (j = 0; j < n; j++) {
      if (i == j) {
        continue;
      }
      score = (long long)abs(city[i].pos - city[j].pos) * d + city[i].scale +
              city[j].scale;
      if (score < minscore) {
        minscore = score;
        minpos = j;
      }
    }
    city[i].reachable++;
    city[minpos].reachable++;
    score_sum += minscore;
    if (i < minpos) {
      road[n_road].a = i;
      road[n_road].b = minpos;
    } else {
      road[n_road].a = minpos;
      road[n_road].b = i;
    }
    n_road++;
  }
  if (n_road != n - 1) {
    city[0].reachable = 1;
    for (i = 1; i < n; i++) {
      city[i].reachable = 0;
    }
  }
  while (n_road != n - 1) {
    qsort(road, n_road, sizeof(ROAD), qsort_compare_road);
    for (i = 0; i < n_road; i++) {
      if (city[road[i].a].reachable) {
        city[road[i].b].reachable = 1;
      } else if (city[road[i].b].reachable) {
        city[road[i].a].reachable = 1;
      }
    }
    minscore = LLONG_MAX;
    for (i = 0; i < n; i++) {
      if (!city[i].reachable) {
        continue;
      }
      for (j = 0; j < n; j++) {
        if (city[j].reachable) {
          continue;
        }
        score = (long long)abs(city[i].pos - city[j].pos) * d + city[i].scale +
                city[j].scale;
        if (score < minscore) {
          minscore = score;
          if (i < j) {
            road[n_road].a = i;
            road[n_road].b = j;
          } else {
            road[n_road].a = j;
            road[n_road].b = i;
          }
        }
      }
    }
    score_sum += minscore;
    n_road++;
  }
  printf("%d\n", score_sum);
  return 0;
}
