#include <bits/stdc++.h>
using namespace std;
const int IX[] = {1, 0, -1, 0, 1, 1, -1, -1};
const int IY[] = {0, 1, 0, -1, -1, 1, 1, -1};
const int MAXN = 109;
int DAT, n, m, i, j, k, c, d[MAXN], a[MAXN], es = -1, l, r;
int x[MAXN], y[MAXN];
struct edge {
  int t;
  edge *p;
} e[MAXN * MAXN * 2], *v[MAXN];
inline void addedge(int i, int j) {
  e[++es].t = j;
  e[es].p = v[i];
  v[i] = e + es;
}
inline bool inn(int u) {
  return (x[n] <= x[u] <= x[1] || x[n] >= x[u] >= x[1]) &&
         (y[n] <= y[u] <= y[1] || y[n] >= y[u] >= y[1]);
}
bool ck(int ans) {
  memset(d, -1, sizeof(d));
  d[1] = ans;
  queue<int> Q;
  Q.push(1);
  while (!Q.empty()) {
    k = Q.front();
    Q.pop();
    for (edge *E = v[k]; E; E = E->p)
      if (c * abs(x[E->t] - x[k]) + c * abs(y[E->t] - y[k]) <= d[k])
        if (d[k] - c * abs(x[E->t] - x[k]) - c * abs(y[E->t] - y[k]) + a[E->t] >
            d[E->t]) {
          Q.push(E->t);
          d[E->t] = d[k] - c * abs(x[E->t] - x[k]) - c * abs(y[E->t] - y[k]) +
                    a[E->t];
        }
  }
  return d[n] != -1;
}
int main() {
  scanf("%d%d", &n, &c);
  for (i = 2; i < n; i++) scanf("%d", &a[i]);
  a[1] = a[n] = 0;
  for (i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++)
      if (i != j && inn(i) && inn(j)) addedge(i, j);
  l = 0;
  r = abs(x[n] - x[1]) * c + abs(y[n] - y[1]) * c;
  while (r > l) {
    int mid = l + r >> 1;
    if (ck(mid))
      r = mid;
    else
      l = mid + 1;
  }
  printf("%d\n", l);
  return 0;
}
