#include <bits/stdc++.h>
using namespace std;
long long findMinAdj(vector<long long>& safeCols, long long li, long long li1,
                     long long diff) {
  long long ans = INT_MAX;
  long long safe1 =
      lower_bound(safeCols.begin(), safeCols.end(), li) - safeCols.begin();
  long long safe2 = safe1 - 1;
  if (safe1 != safeCols.size()) {
    ans =
        min(ans, abs(li - safeCols[safe1]) + abs(safeCols[safe1] - li1) + diff);
  }
  if (safe2 != -1) {
    ans =
        min(ans, abs(li - safeCols[safe2]) + abs(safeCols[safe2] - li1) + diff);
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  long long test = 1;
  for (long long T = 1; T <= test; ++T) {
    long long N, M, K, Q;
    cin >> N >> M >> K >> Q;
    vector<pair<long long, long long>> treasures(K);
    for (long long i = 0; i < K; ++i) {
      cin >> treasures[i].first >> treasures[i].second;
      --treasures[i].first;
      --treasures[i].second;
    }
    vector<long long> safeCols(Q);
    for (long long i = 0; i < Q; ++i) {
      cin >> safeCols[i];
      --safeCols[i];
    }
    sort(treasures.begin(), treasures.end());
    sort(safeCols.begin(), safeCols.end());
    vector<long long> leftmosts(N);
    vector<long long> rightmosts(N);
    vector<bool> tpresent(N, false);
    long long curr = 0;
    for (long long i = 0; i < N; ++i) {
      if (curr == K || treasures[curr].first > i) {
        leftmosts[i] = rightmosts[i] = -1;
        continue;
      }
      leftmosts[i] = treasures[curr].second;
      tpresent[i] = true;
      while (curr != K && treasures[curr].first == i) {
        ++curr;
      }
      rightmosts[i] = treasures[curr - 1].second;
    }
    vector<long long> nextRow(N);
    curr = -1;
    for (long long i = N - 1; i >= 0; --i) {
      nextRow[i] = curr;
      if (tpresent[i]) {
        curr = i;
      }
    }
    vector<long long> LL(N - 1, INT_MAX);
    vector<long long> LR(N - 1, INT_MAX);
    vector<long long> RL(N - 1, INT_MAX);
    vector<long long> RR(N - 1, INT_MAX);
    for (long long i = 0; i < N - 1; ++i) {
      if (nextRow[i] == -1) {
        continue;
      }
      long long j = nextRow[i];
      long long li = leftmosts[i];
      long long ri = rightmosts[i];
      long long li1 = leftmosts[j];
      long long ri1 = rightmosts[j];
      LL[i] = findMinAdj(safeCols, li, li1, j - i);
      LR[i] = findMinAdj(safeCols, li, ri1, j - i);
      RL[i] = findMinAdj(safeCols, ri, li1, j - i);
      RR[i] = findMinAdj(safeCols, ri, ri1, j - i);
    }
    vector<long long> rtol(N);
    for (long long i = 0; i < N; ++i) {
      rtol[i] = abs(leftmosts[i] - rightmosts[i]);
    }
    vector<pair<long long, long long>> dp(N);
    dp[N - 1].first = dp[N - 1].second = rtol[N - 1];
    for (long long i = N - 2; i >= 0; --i) {
      if (!tpresent[i]) {
        continue;
      }
      if (nextRow[i] == -1) {
        dp[i].first = dp[i].second = rtol[i];
        continue;
      }
      dp[i].first =
          min(RL[i] + dp[nextRow[i]].first, RR[i] + dp[nextRow[i]].second) +
          rtol[i];
      dp[i].second =
          min(LL[i] + dp[nextRow[i]].first, LR[i] + dp[nextRow[i]].second) +
          rtol[i];
    }
    if (tpresent[0]) {
      cout << leftmosts[0] + dp[0].first << '\n';
    } else {
      int n = nextRow[0];
      cout << min(findMinAdj(safeCols, 0, leftmosts[n], n) +
                      dp[nextRow[0]].first,
                  findMinAdj(safeCols, 0, rightmosts[n], n) +
                      dp[nextRow[0]].second)
           << '\n';
    }
  }
}
