using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Numerics;
using System.Diagnostics;

class Program
{
    public void Slove()
    {
        string[] inputs = Console.ReadLine().Split();
        int n = int.Parse(inputs[0]);
        int d = int.Parse(inputs[1]);
        long[][] distance =
            Enumerable.Range(0, n)
            .Select(x => new long[n])
            .ToArray();
        int[] city = 
            Console.ReadLine().Split()
            .Select(int.Parse).ToArray();
        foreach(int i in Enumerable.Range(0, n))
        {
            distance[i][i] = long.MaxValue;
            foreach(int j in Enumerable.Range(0, n).Skip(i + 1))
            {
                distance[i][j] = (j - i) * d + city[i] + city[j];
                distance[j][i] = distance[i][j];
            }
        }
        bool[] conect = new bool[n];
        conect[0] = true; 
        long cost = 0;
        long[] dp = distance[0];
        while(conect.Any(x => !x))
        {
            int next = 
                Enumerable.Range(0, n) 
                .Where(x => !conect[x])
                .Aggregate(0, (ret, index) => 
                    dp[index] > dp[ret] ? ret : index);
            //Console.WriteLine(next);
            cost += dp[next];
            foreach(int i in Enumerable.Range(0, n).Where(x => !conect[x]))
            {
                dp[i] = Math.Min(dp[i], distance[next][i]);
            }
            conect[next] = true;
        }
        Console.WriteLine(cost);
    }
    static void Main(string[] args)
    {
        var p = new Program();
        p.Slove();
    }
}
