#include <bits/stdc++.h>
using namespace std;
int ri() {
  int x;
  if (scanf(" %d", &x) == EOF) return -1;
  return x;
}
long long int rl() {
  long long int x;
  if (cin >> x) return x;
  return -1;
}
string rs() {
  string s;
  if (cin >> s) return s;
  return "";
}
struct SafeCols {
  set<int> S;
  SafeCols() {
    S.insert(-1);
    S.insert(1 << 29);
  };
  void add(int x) { S.insert(x); }
  int left(int x) { return *(--S.upper_bound(x)); }
  int right(int x) { return *S.lower_bound(x); }
  bool isSafe(int x) { return S.count(x) > 0; }
};
struct Pos {
  int x, y;
  long long int cost;
};
struct MyQ {
  int n;
  queue<pair<int, int>> q;
  vector<map<int, long long int>> costs;
  MyQ(int m, int n) : n(n), costs(m + 1, map<int, long long int>()) {}
  void push(Pos p) {
    if (p.y < 0 || p.y >= n) return;
    const long long int inf = (1LL << 54);
    long long int curCost = inf;
    if (costs[p.x].count(p.y))
      curCost = costs[p.x][p.y];
    else
      q.push({p.x, p.y});
    if (p.cost < curCost) {
      costs[p.x][p.y] = p.cost;
    }
  }
  bool empty() { return q.empty(); }
  Pos pop() {
    pair<int, int> p = q.front();
    q.pop();
    return {p.first, p.second, costs[p.first][p.second]};
  }
};
struct SingleCase {
  int m, n;
  vector<int> left, right;
  SafeCols safeCols;
  bool solveCase() {
    m = ri();
    if (m < 0) return false;
    n = ri();
    int treasures = ri();
    int _s = ri();
    left = vector<int>(m, n + 1);
    right = vector<int>(m, -1);
    int maxRow = 0;
    for (int i = 0; i < treasures; ++i) {
      int x = ri() - 1;
      int y = ri() - 1;
      left[x] = min(left[x], y);
      right[x] = max(right[x], y);
      maxRow = max(maxRow, x);
    }
    m = maxRow + 1;
    for (int i = 0; i < _s; ++i) safeCols.add(ri() - 1);
    MyQ q(m, n);
    for (int i = 0; i < m; ++i)
      if (right[i] >= 0) {
        if (i == 0) {
          q.push({0, 0, 0});
        } else {
          int j = safeCols.right(0);
          q.push({i, j, i + j});
        }
        break;
      }
    long long int ret = (1LL << 60);
    while (!q.empty()) {
      Pos p = q.pop();
      int x = p.x, y = p.y;
      long long int cost = p.cost;
      if (y < 0 || y >= n) continue;
      if (x == m - 1) {
        ret = min(ret, cost + abs(y - left[x]) + abs(left[x] - right[x]));
        ret = min(ret, cost + abs(y - right[x]) + abs(left[x] - right[x]));
        continue;
      }
      append(q, x, y, cost);
    }
    cout << ret << endl;
    return true;
  }
  void append(MyQ& q, int x, int y, long long int cost) {
    if (right[x] < 0) {
      assert(safeCols.isSafe(y));
      q.push({x + 1, y, cost + 1});
      return;
    }
    int l = left[x], r = right[x];
    q.push({x + 1, safeCols.right(r),
            cost + abs(y - l) + abs(l - r) + abs(r - safeCols.right(r)) + 1});
    q.push({x + 1, safeCols.left(r),
            cost + abs(y - l) + abs(l - r) + abs(r - safeCols.left(r)) + 1});
    q.push({x + 1, safeCols.right(l),
            cost + abs(y - r) + abs(r - l) + abs(l - safeCols.right(l)) + 1});
    q.push({x + 1, safeCols.left(l),
            cost + abs(y - r) + abs(r - l) + abs(l - safeCols.left(l)) + 1});
  }
};
int main() {
  while (SingleCase().solveCase()) {
  };
}
