#include <bits/stdc++.h>
using namespace std;
int n, m, k, q;
pair<long long, long long> tre[200005];
long long col[200005], dp[200005][2];
vector<long long> adj[200005], trow;
long long get_dist(long long cur, long long up, long long st, long long fn,
                   bool lft) {
  long long ret = abs(cur - up);
  if (lft) {
    if (up <= fn)
      ret += (fn - st) + (fn - up);
    else
      ret += up - st;
  } else {
    if (up >= st)
      ret += (fn - st) + (up - st);
    else
      ret += fn - up;
  }
  return ret;
}
int main() {
  scanf("%d %d %d %d", &n, &m, &k, &q);
  for (int i = 1; i <= k; i++) {
    long long r, c;
    scanf("%lld %lld", &r, &c);
    if (tre[r].first == 0 || tre[r].first > c) tre[r].first = c;
    if (tre[r].second == 0 || tre[r].second < c) tre[r].second = c;
  }
  for (int i = 1; i <= q; i++) scanf("%lld", &col[i]);
  for (int i = 1; i <= n; i++)
    if (tre[i] != pair<long long, long long>(0, 0))
      trow.push_back((long long)i);
  sort(col + 1, col + 1 + q);
  col[q + 1] = m + 1;
  for (int i = 1; i <= q; i++) {
    for (long long val = col[i]; val < col[i + 1]; val++)
      adj[val].push_back(col[i]);
  }
  for (int i = q; i >= 1; i--) {
    for (long long val = col[i] - 1; val > col[i - 1]; val--)
      adj[val].push_back(col[i]);
  }
  if (trow[0] == 1) {
    dp[0][0] = get_dist(1, 1, tre[1].first, tre[1].second, true);
    dp[0][1] = get_dist(1, 1, tre[1].first, tre[1].second, false);
  } else {
    dp[0][0] =
        get_dist(1, adj[1][0], tre[trow[0]].first, tre[trow[0]].second, true);
    dp[0][1] =
        get_dist(1, adj[1][0], tre[trow[0]].first, tre[trow[0]].second, false);
  }
  for (int i = 0; i < trow.size() - 1; i++) {
    long long row = trow[i + 1];
    long long lval = tre[trow[i]].first, rval = tre[trow[i]].second;
    dp[i + 1][0] = dp[i][0] + get_dist(lval, adj[lval][0], tre[row].first,
                                       tre[row].second, true);
    dp[i + 1][0] = min(dp[i + 1][0],
                       dp[i][1] + get_dist(rval, adj[rval][0], tre[row].first,
                                           tre[row].second, true));
    dp[i + 1][1] = dp[i][0] + get_dist(lval, adj[lval][0], tre[row].first,
                                       tre[row].second, false);
    dp[i + 1][1] = min(dp[i + 1][1],
                       dp[i][1] + get_dist(rval, adj[rval][0], tre[row].first,
                                           tre[row].second, false));
    if (adj[lval].size() > 1) {
      dp[i + 1][0] = min(dp[i + 1][0],
                         dp[i][0] + get_dist(lval, adj[lval][1], tre[row].first,
                                             tre[row].second, true));
      dp[i + 1][1] = min(dp[i + 1][1],
                         dp[i][0] + get_dist(lval, adj[lval][1], tre[row].first,
                                             tre[row].second, false));
    }
    if (adj[rval].size() > 1) {
      dp[i + 1][0] = min(dp[i + 1][0],
                         dp[i][1] + get_dist(rval, adj[rval][1], tre[row].first,
                                             tre[row].second, true));
      dp[i + 1][1] = min(dp[i + 1][1],
                         dp[i][1] + get_dist(rval, adj[rval][1], tre[row].first,
                                             tre[row].second, false));
    }
  }
  int sz = trow.size();
  printf("%lld", min(dp[sz - 1][0], dp[sz - 1][1]) + trow[sz - 1] - 1);
  return 0;
}
