#include <bits/stdc++.h>
using namespace std;
const int MAX = 200000;
int first[MAX], last[MAX], cols[MAX], Left[MAX], Right[MAX];
vector<int> treasureRows;
long long dp[200000][2] = {};
long long solve(int index = 0, int side = 1) {
  long long& ans = dp[index][side];
  if (ans != -1) return ans;
  if (index == ((int)treasureRows.size()) - 1) return ans = 0;
  int curRow = treasureRows[index];
  int nextRow = treasureRows[index + 1];
  ans = (long long)1e18;
  int curCol = side == 1 ? last[curRow] : first[curRow];
  if (Left[curCol] < curCol && Left[curCol] >= 0) {
    int nextCol = Left[curCol];
    int steps = curCol - Left[curCol] + nextRow - curRow;
    if (first[nextRow] >= nextCol) {
      steps += last[nextRow] - nextCol;
      ans = min(ans, steps + solve(index + 1, 1));
    } else if (last[nextRow] <= nextCol) {
      steps += (nextCol - first[nextRow]);
      ans = min(ans, steps + solve(index + 1, 0));
    } else {
      ans = min(ans, steps + nextCol - first[nextRow] + last[nextRow] -
                         first[nextRow] + solve(index + 1, 1));
      ans = min(ans, steps + last[nextRow] - nextCol + last[nextRow] -
                         first[nextRow] + solve(index + 1, 0));
    }
  }
  if (Right[curCol] >= curCol) {
    int nextCol = Right[curCol];
    int steps = nextCol - curCol + nextRow - curRow;
    if (first[nextRow] >= nextCol) {
      steps += last[nextRow] - nextCol;
      ans = min(ans, steps + solve(index + 1, 1));
    } else if (last[nextRow] <= nextCol) {
      steps += (nextCol - first[nextRow]);
      ans = min(ans, steps + solve(index + 1, 0));
    } else {
      ans = min(ans, steps + nextCol - first[nextRow] + last[nextRow] -
                         first[nextRow] + solve(index + 1, 1));
      ans = min(ans, steps + last[nextRow] - nextCol + last[nextRow] -
                         first[nextRow] + solve(index + 1, 0));
    }
  }
  return ans;
}
int main() {
  int n = ({
    int x;
    scanf("%d", &x);
    x;
  }),
      m = ({
        int x;
        scanf("%d", &x);
        x;
      }),
      k = ({
        int x;
        scanf("%d", &x);
        x;
      }),
      q = ({
        int x;
        scanf("%d", &x);
        x;
      });
  for (int i = (0); i < (n); i += (1)) first[i] = last[i] = -1;
  for (int i = (0); i < (n); i += (1)) {
    dp[i][0] = dp[i][1] = -1;
  }
  for (int i = (0); i < (k); i += (1)) {
    int ri = ({
      int x;
      scanf("%d", &x);
      x;
    }),
        ci = ({
          int x;
          scanf("%d", &x);
          x;
        });
    ri--;
    ci--;
    first[ri] = first[ri] == -1 ? ci : min(first[ri], ci);
    last[ri] = last[ri] == -1 ? ci : max(last[ri], ci);
  }
  if (first[0] == -1) first[0] = last[0] = 0;
  for (int i = (0); i < (n); i += (1)) {
    if (first[i] != -1) {
      treasureRows.push_back(i);
    }
  }
  for (int i = (0); i < (q); i += (1)) {
    int c = ({
      int x;
      scanf("%d", &x);
      x;
    });
    c--;
    cols[c] = 1;
  }
  for (int i = (0); i < (m); i += (1)) {
    Left[i] = cols[i] ? i : (i == 0 ? -1 : Left[i - 1]);
  }
  for (int i = (m - 1); i >= (0); i--) {
    Right[i] = cols[i] ? i : (i == m - 1 ? -1 : Right[i + 1]);
  }
  for (int i = (((int)treasureRows.size()) - 1); i >= (0); i--) {
    solve(i, 0);
    solve(i, 1);
  }
  cout << last[0] + solve() << endl;
}
