#include <bits/stdc++.h>
using namespace std;
const long long md = 1e9 + 7;
const int xn = 2e5 + 10;
const int xm = 1e2 + 10;
const int SQ = 320;
const int sq = 1e3 + 10;
const long long inf = 1e18 + 10;
long long power(long long a, long long b) {
  return (!b ? 1
             : (b & 1 ? a * power(a * a % md, b / 2) % md
                      : power(a * a % md, b / 2) % md));
}
int n, m, k, q, B[xn];
long long dp[xn][2];
pair<int, int> A[xn], Nearest[xn];
vector<pair<int, int> > adj[xn];
void Build() {
  for (int i = 0; i < k; i++) {
    int x = A[i].second;
    int l = -1, r = q, mid;
    while (r - l > 1) {
      mid = (l + r) / 2;
      if (B[mid] <= x)
        l = mid;
      else
        r = mid;
    }
    if (l == -1)
      Nearest[i].first = -1;
    else
      Nearest[i].first = B[l];
    l = -1, r = q, mid;
    while (r - l > 1) {
      mid = (l + r) / 2;
      if (B[mid] < x)
        l = mid;
      else
        r = mid;
    }
    if (r == q)
      Nearest[i].second = -1;
    else
      Nearest[i].second = B[r];
  }
}
long long dist(int ii, int jj) {
  pair<int, int> i = A[ii], j = A[jj];
  swap(i.first, i.second);
  swap(j.first, j.second);
  long long x = Nearest[ii].first, ans = inf;
  if (x != -1) ans = min(ans, abs(i.first - x) + abs(j.first - x));
  x = Nearest[ii].second;
  if (x != -1) ans = min(ans, abs(i.first - x) + abs(j.first - x));
  x = Nearest[jj].first;
  if (x != -1) ans = min(ans, abs(i.first - x) + abs(j.first - x));
  x = Nearest[jj].second;
  if (x != -1) ans = min(ans, abs(i.first - x) + abs(j.first - x));
  return ans + abs(i.second - j.second);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> m >> k >> q;
  for (int i = 0; i < k; i++) cin >> A[i].first >> A[i].second;
  for (int i = 0; i < q; i++) cin >> B[i];
  bool fl1 = false;
  for (int i = 0; i < k; i++)
    if (A[i].first == 1 && A[i].second == 1) fl1 = true;
  if (!fl1) A[k] = {1, 1}, k++;
  sort(B, B + q);
  sort(A, A + k);
  Build();
  for (int i = 0; i < k; i++) {
    if (i > 0 && i < k - 1 && A[i - 1].first == A[i].first &&
        A[i + 1].first == A[i].first)
      continue;
    adj[A[i].first].push_back({A[i].second, i});
  }
  int last = -1;
  for (int i = 1; i <= n; i++) {
    if (!adj[i].size()) continue;
    if (last == -1) {
      long long d = 0;
      if (adj[i].size() == 2) d = abs(adj[i][0].first - adj[i][1].first);
      for (int j = 0; j < adj[i].size(); j++) {
        int ind = adj[i][j].second, x = adj[i][j].first, dx = j;
        dp[ind][0] = x - 1;
        if (adj[i].size() == 2) dx = 1 - j;
        dp[ind][1] = d + adj[i][dx].first - 1;
      }
      last = i;
      continue;
    }
    for (int j = 0; j < adj[i].size(); j++) {
      long long mn = inf;
      for (int p = 0; p < adj[last].size(); p++) {
        int ind1 = adj[i][j].second, ind2 = adj[last][p].second;
        mn = min(mn, dist(ind1, ind2) + dp[ind2][1]);
      }
      dp[adj[i][j].second][0] = mn;
    }
    long long d = 0;
    if (adj[i].size() == 2) d = abs(adj[i][0].first - adj[i][1].first);
    for (int j = 0; j < adj[i].size(); j++) {
      int ind = adj[i][j].second, dx = adj[i][1 - j].second;
      if (adj[i].size() == 1) dx = adj[i][j].second;
      dp[ind][1] = dp[dx][0] + d;
    }
    last = i;
  }
  int up = 0;
  for (int i = 0; i < k; i++) up = A[i].first;
  long long ans = inf;
  for (int i = 0; i < adj[up].size(); i++) {
    int ind = adj[up][i].second;
    ans = min(ans, dp[ind][1]);
  }
  cout << ans << '\n';
  return 0;
}
