#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);
template <typename Iterator>
void pushIfNotLast(vector<long long>& keySafes, Iterator result,
                   Iterator last) {
  if (result != last) {
    keySafes.push_back(*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);
  }
}
vector<long long> keySafes[MAX_VALUE];
vector<long long> treasures[MAX_VALUE];
map<long long, long long> d[MAX_VALUE];
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]};
      } else {
        keySafes[i] = keySafes[i - 1];
      }
      continue;
    }
    int leftTreasure = treasures[i].front();
    int rightTreasure = treasures[i].back();
    pushIfNotLast(keySafes[i],
                  lower_bound(safe.rbegin(), safe.rend(), leftTreasure,
                              std::greater<int>()),
                  safe.rend());
    pushIfNotLast(keySafes[i],
                  lower_bound(safe.begin(), safe.end(), leftTreasure),
                  safe.end());
    pushIfNotLast(keySafes[i],
                  lower_bound(safe.rbegin(), safe.rend(), rightTreasure,
                              std::greater<int>()),
                  safe.rend());
    pushIfNotLast(keySafes[i],
                  lower_bound(safe.begin(), safe.end(), rightTreasure),
                  safe.end());
  }
  for (int i = 0; i < 4; i++) {
    long long keySafe = keySafes[0][i];
    d[0][keySafe] = pick(treasures[0], 0, keySafe);
  }
  for (int i = 1; i < numRows - 1; i++) {
    for (int j : keySafes[i]) {
      d[i][j] = INF;
      for (int k : keySafes[i - 1]) {
        long long completeRowMoves = pick(treasures[i], k, j);
        d[i][j] = min(d[i][j], d[i - 1][k] + 1 + completeRowMoves);
      }
    }
  }
  long long ans = INF;
  const vector<long long>& lastRow = treasures[numRows - 1];
  const int prevRow = numRows - 2;
  for (int endCol : lastRow) {
    for (int prevCol : keySafes[prevRow]) {
      ans = min(ans, d[prevRow][prevCol] + 1 + pick(lastRow, prevCol, endCol));
    }
  }
  cout << ans << endl;
  return 0;
}
