#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
vector<pair<int, int> > g[N], points;
vector<int> col;
int n, m, k, q, lst = 1, nxt_row[N];
long long dp[N][2];
int nearest_col(int x, bool right) {
  auto it = lower_bound(col.begin(), col.end(), x);
  if (!right && it != col.begin()) it--;
  if (it == col.end()) it--;
  return *it;
}
int nearest_cell(int row, int col, bool right) {
  auto it = lower_bound(g[row].begin(), g[row].end(), make_pair(col, 0));
  if (!right && it != g[row].begin()) it--;
  if (it == g[row].end()) it--;
  return it->second;
}
int dist(int a, int b) { return abs(a - b); }
long long solve(int idx, bool flag) {
  if (~dp[idx][flag]) return dp[idx][flag];
  long long ret = 1e12;
  int x = points[idx].first, y = points[idx].second;
  if (flag) {
    if (g[x].empty()) return dp[idx][flag] = solve(idx, 0);
    int d = dist(y, g[x].back().first) + dist(g[x][0].first, g[x].back().first);
    ret = min(ret, solve(g[x][0].second, 0) + d);
    d = dist(y, g[x][0].first) + dist(g[x][0].first, g[x].back().first);
    ret = min(ret, solve(g[x].back().second, 0) + d);
  } else {
    if (x == lst) return 0;
    int row = nxt_row[x];
    int l = nearest_col(y, 0), r = nearest_col(y, 1);
    int nxt[4];
    nxt[0] = nearest_cell(row, l, 0), nxt[1] = nearest_cell(row, r, 0),
    nxt[2] = nearest_cell(row, l, 1), nxt[3] = nearest_cell(row, r, 1);
    int d = row - x;
    ret = min(ret, solve(nxt[0], 1) + d + dist(y, l) +
                       dist(l, points[nxt[0]].second));
    ret = min(ret, solve(nxt[1], 1) + d + dist(y, r) +
                       dist(r, points[nxt[1]].second));
    ret = min(ret, solve(nxt[2], 1) + d + dist(y, l) +
                       dist(l, points[nxt[2]].second));
    ret = min(ret, solve(nxt[3], 1) + d + dist(y, r) +
                       dist(r, points[nxt[3]].second));
  }
  return dp[idx][flag] = ret;
}
int main() {
  memset(dp, -1, sizeof dp);
  scanf("%d%d%d%d", &n, &m, &k, &q);
  for (int i = 1; i <= k; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    points.push_back({x, y});
  }
  k++;
  points.push_back({1, 1});
  sort(points.begin(), points.end());
  for (int i = 1; i < k; i++)
    g[points[i].first].push_back({points[i].second, i}),
        nxt_row[lst] = points[i].first, lst = points[i].first;
  for (int i = 0; i < q; i++) {
    int x;
    scanf("%d", &x);
    col.push_back(x);
  }
  sort(col.begin(), col.end());
  cout << solve(0, 1);
  return 0;
}
