#include <bits/stdc++.h>
using namespace std;
int n, m, k, q;
int lef[200001], rht[200001];
int cols[200001];
int last;
map<pair<int, int>, long long int> d;
long long int f(int row, int col) {
  if (d.find(make_pair(row, col)) != d.end()) {
    return d[make_pair(row, col)];
  }
  if (row == last) {
    long long int ans = 10000000000000;
    if (lef[row] < col && col < rht[row]) {
      long long int fir = col - lef[row] + rht[row] - lef[row];
      long long int sec = rht[row] - col + rht[row] - lef[row];
      ans = min({ans, fir, sec});
    } else if (col <= lef[row]) {
      ans = min(ans, (long long int)rht[row] - col);
    } else {
      ans = min(ans, (long long int)col - lef[row]);
    }
    d[make_pair(row, col)] = ans;
    return ans;
  }
  if (lef[row] == INT_MAX) {
    long long int ans = 10000000000000;
    auto it = upper_bound(cols, cols + q, col);
    if (it != cols) {
      it--;
      ans = min(ans, col - *it + 1 + f(row - 1, *it));
    }
    it = lower_bound(cols, cols + q, col);
    if (it != cols + q) {
      ans = min(ans, *it - col + 1 + f(row - 1, *it));
    }
    d[make_pair(row, col)] = ans;
    return ans;
  }
  long long int lmin = 10000000000000, rmin = 10000000000000;
  auto it = upper_bound(cols, cols + q, lef[row]);
  if (it != cols) {
    it--;
    lmin = min(lmin, lef[row] - *it + 1 + f(row - 1, *it));
  }
  it = lower_bound(cols, cols + q, lef[row]);
  if (it != cols + q) {
    lmin = min(lmin, *it - lef[row] + 1 + f(row - 1, *it));
  }
  it = upper_bound(cols, cols + q, rht[row]);
  if (it != cols) {
    it--;
    rmin = min(rmin, rht[row] - *it + 1 + f(row - 1, *it));
  }
  it = lower_bound(cols, cols + q, rht[row]);
  if (it != cols + q) {
    rmin = min(rmin, *it - rht[row] + 1 + f(row - 1, *it));
  }
  long long int ans = 10000000000000;
  if (lef[row] < col && col < rht[row]) {
    long long int fir = col - lef[row] + rht[row] - lef[row] + rmin;
    long long int sec = rht[row] - col + rht[row] - lef[row] + lmin;
    ans = min({ans, fir, sec});
  } else if (col <= lef[row]) {
    ans = min(ans, rht[row] - col + rmin);
  } else {
    ans = min(ans, col - lef[row] + lmin);
  }
  d[make_pair(row, col)] = ans;
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> m >> k >> q;
  fill(lef, lef + n + 1, INT_MAX);
  memset(rht, 0, sizeof rht);
  for (int i = 0; i < k; i++) {
    int r, c;
    cin >> r >> c;
    r = n + 1 - r;
    lef[r] = min(lef[r], c);
    rht[r] = max(rht[r], c);
  }
  for (int i = 0; i < q; i++) {
    cin >> cols[i];
  }
  sort(cols, cols + q);
  for (int i = 1; i <= n; i++) {
    if (lef[i] != INT_MAX) {
      last = i;
      break;
    }
  }
  cout << f(n, 1);
}
