#include <bits/stdc++.h>
using namespace std;
int dx[] = {0, 0, 1, -1, -1, -1, 1, 1};
int dy[] = {1, -1, 0, 0, -1, 1, 1, -1};
template <class T>
inline T biton(T n, T pos) {
  return n | ((T)1 << pos);
}
template <class T>
inline T bitoff(T n, T pos) {
  return n & ~((T)1 << pos);
}
template <class T>
inline T ison(T n, T pos) {
  return (bool)(n & ((T)1 << pos));
}
template <class T>
inline T gcd(T a, T b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
template <typename T>
string NumberToString(T Number) {
  ostringstream second;
  second << Number;
  return second.str();
}
inline int nxt() {
  int aaa;
  scanf("%d", &aaa);
  return aaa;
}
inline long long int lxt() {
  long long int aaa;
  scanf("%lld", &aaa);
  return aaa;
}
inline double dxt() {
  double aaa;
  scanf("%lf", &aaa);
  return aaa;
}
template <class T>
inline T bigmod(T p, T e, T m) {
  T ret = 1;
  for (; e > 0; e >>= 1) {
    if (e & 1) ret = (ret * p) % m;
    p = (p * p) % m;
  }
  return (T)ret;
}
int ar[1000010];
vector<int> safe;
vector<int> cell[1000010];
int mxRow = 0;
long long int dp[1000010][2][2];
long long int go(int pos, int Left, bool isComplete) {
  if (pos == mxRow) {
    if (isComplete)
      return 0;
    else {
      return abs(cell[pos][0] - cell[pos].back());
    }
  }
  long long int& res = dp[pos][Left][isComplete];
  if (res != -1) return res;
  res = LLONG_MAX;
  if (isComplete) {
    int nxtPos = pos;
    for (int i = pos + 1; i <= mxRow; i++) {
      if (cell[i].size() > 0) {
        nxtPos = i;
        break;
      }
    }
    int curColumn;
    if (Left) {
      curColumn = cell[pos][0];
    } else {
      curColumn = cell[pos].back();
    };
    ;
    int l = lower_bound(safe.begin(), safe.end(), curColumn) - safe.begin();
    if (l < safe.size()) {
      int rightColumn = safe[l];
      int ind =
          upper_bound(cell[nxtPos].begin(), cell[nxtPos].end(), rightColumn) -
          cell[nxtPos].begin();
      bool c = 0;
      if (ind == cell[nxtPos].size()) c = 1;
      ;
      res = min(res, go(nxtPos, 1, c) + (nxtPos - pos) +
                         abs(safe[l] - cell[nxtPos][0]) +
                         abs(safe[l] - curColumn));
      ind = lower_bound(cell[nxtPos].begin(), cell[nxtPos].end(), rightColumn) -
            cell[nxtPos].begin();
      c = 0;
      if (ind == 0) c = 1;
      res = min(res, go(nxtPos, 0, c) + (nxtPos - pos) +
                         abs(safe[l] - cell[nxtPos].back()) +
                         abs(safe[l] - curColumn));
    }
    if (l) {
      int rightColumn = safe[l - 1];
      int ind =
          upper_bound(cell[nxtPos].begin(), cell[nxtPos].end(), rightColumn) -
          cell[nxtPos].begin();
      bool c = 0;
      if (ind == cell[nxtPos].size()) c = 1;
      res = min(res, go(nxtPos, 1, c) + (nxtPos - pos) +
                         abs(safe[l - 1] - cell[nxtPos][0]) +
                         abs(safe[l - 1] - curColumn));
      ind = lower_bound(cell[nxtPos].begin(), cell[nxtPos].end(), rightColumn) -
            cell[nxtPos].begin();
      c = 0;
      if (ind == 0) c = 1;
      res = min(res, go(nxtPos, 0, c) + (nxtPos - pos) +
                         abs(safe[l - 1] - cell[nxtPos].back()) +
                         abs(safe[l - 1] - curColumn));
    }
  } else {
    if (Left) {
      res = min(res, go(pos, 0, 1) + abs(cell[pos][0] - cell[pos].back()));
    } else {
      res = min(res, go(pos, 1, 1) + abs(cell[pos][0] - cell[pos].back()));
    }
  }
  return res;
}
int main() {
  int n = nxt();
  int m = nxt();
  int k = nxt();
  int q = nxt();
  for (int i = 0; i < k; i++) {
    int x = nxt();
    int y = nxt();
    cell[x].push_back(y);
    mxRow = max(mxRow, x);
  }
  for (int i = 0; i < q; i++) {
    int a = nxt();
    safe.push_back(a);
  }
  sort(safe.begin(), safe.end());
  for (int i = 1; i <= n; i++) {
    sort(cell[i].begin(), cell[i].end());
  }
  if (cell[1].empty() || cell[1][0] != 1) cell[1].push_back(1);
  sort(cell[1].begin(), cell[1].end());
  memset(dp, -1, sizeof(dp));
  cout << go(1, 1, 0) << endl;
  return 0;
}
