#include <bits/stdc++.h>
using namespace std;
const int MAX_VALUE = 2 * 100000 + 100;
const long long INF = 1000LL * (long long)(MAX_VALUE) * (long long)(MAX_VALUE);
vector<long long> keySafes[MAX_VALUE];
vector<long long> treasures[MAX_VALUE];
long long d[MAX_VALUE][4];
template <typename Iterator>
long long getOrDefault(Iterator result, Iterator last, long long defaultValue) {
  if (result == last) {
    return defaultValue;
  }
  return *result;
}
long long pick(const vector<long long>& treasures, long long start,
               long long end) {
  if (treasures.empty()) {
    return abs(end - start);
  }
  long long firstLastDistance = treasures.back() - treasures.front();
  if (start < end) {
    return abs(start - treasures.front()) + firstLastDistance +
           abs(treasures.back() - end);
  } else {
    return abs(start - treasures.back()) + firstLastDistance +
           abs(treasures.front() - end);
  }
}
int main() {
  int numRows, numCols, numTreasures, numSafe;
  cin >> numRows >> numCols >> numTreasures >> numSafe;
  vector<long long> row(numTreasures);
  vector<long long> col(numTreasures);
  for (int i = 0; i < numTreasures; i++) {
    cin >> row[i] >> col[i];
    row[i]--;
    col[i]--;
  }
  vector<long long> safe(numSafe);
  for (int i = 0; i < numSafe; i++) {
    cin >> safe[i];
    safe[i]--;
  }
  sort(safe.begin(), safe.end());
  int highestTreasure = 0;
  for (int i = 0; i < numTreasures; i++) {
    treasures[row[i]].push_back(col[i]);
    highestTreasure = max(highestTreasure, (int)row[i]);
  }
  numRows = highestTreasure + 1;
  for (int i = 0; i < numRows; i++) {
    sort(treasures[i].begin(), treasures[i].end());
  }
  if (numRows == 1) {
    cout << (treasures[0].back() - treasures[0].front()) << endl;
    return 0;
  }
  for (int i = 0; i < numRows; i++) {
    if (treasures[i].empty()) {
      if (i == 0) {
        keySafes[i] = {safe[0], safe[0], safe[0], safe[0]};
      } else {
        keySafes[i] = keySafes[i - 1];
      }
      continue;
    }
    int leftTreasure = treasures[i].front();
    int rightTreasure = treasures[i].back();
    keySafes[i].resize(4);
    auto lb = lower_bound(safe.rbegin(), safe.rend(), leftTreasure,
                          std::greater<int>());
    keySafes[i][0] = getOrDefault(lb, safe.rend(), -INF);
    keySafes[i][1] = getOrDefault(
        lower_bound(safe.begin(), safe.end(), leftTreasure), safe.end(), INF);
    lb = lower_bound(safe.rbegin(), safe.rend(), rightTreasure,
                     std::greater<int>());
    keySafes[i][2] = getOrDefault(lb, safe.rend(), -INF);
    keySafes[i][3] = getOrDefault(
        lower_bound(safe.begin(), safe.end(), rightTreasure), safe.end(), INF);
  }
  for (int i = 0; i < 4; i++) {
    d[0][i] = pick(treasures[0], 0, keySafes[0][i]);
  }
  for (int i = 1; i < numRows - 1; i++) {
    for (int j = 0; j < 4; j++) {
      d[i][j] = INF;
      for (int k = 0; k < 4; k++) {
        d[i][j] = min(d[i][j], d[i - 1][k] + 1 +
                                   pick(treasures[i], keySafes[i - 1][k],
                                        keySafes[i][j]));
      }
    }
  }
  long long ans = INF;
  const vector<long long>& lastRow = treasures[numRows - 1];
  for (int endCol : lastRow) {
    for (int prevCol = 0; prevCol < 4; prevCol++) {
      ans = min(ans, d[numRows - 2][prevCol] + 1 +
                         pick(lastRow, keySafes[numRows - 2][prevCol], endCol));
    }
  }
  cout << ans << endl;
  return 0;
}
