#include <bits/stdc++.h>
using namespace std;
pair<int, int> tmp[200010];
struct row {
  int y, minx, maxx;
};
vector<row> treasures;
set<int> columns;
long long dpt[2][200010];
int getNext(int col) {
  set<int>::iterator it = columns.lower_bound(col);
  if (it != columns.end())
    return *it;
  else
    return *prev(it);
}
int getPrev(int col) {
  set<int>::iterator it = columns.lower_bound(col);
  if (it != columns.begin())
    return *prev(it);
  else
    return *it;
}
long long dp(int a, int b) {
  if (dpt[a][b] == -1) {
    dpt[a][b] = treasures[b].maxx - treasures[b].minx;
    if (b != treasures.size() - 1) {
      int x, y = b + 1;
      if (a)
        x = treasures[b].minx;
      else
        x = treasures[b].maxx;
      int c1 = min(abs(getPrev(x) - x) + abs(treasures[y].minx - getPrev(x)),
                   abs(getNext(x) - x) + abs(treasures[y].minx - getNext(x)));
      int c2 = min(abs(getPrev(x) - x) + abs(treasures[y].maxx - getPrev(x)),
                   abs(getNext(x) - x) + abs(treasures[y].maxx - getNext(x)));
      dpt[a][b] +=
          min(c1 + dp(0, y), c2 + dp(1, y)) + treasures[y].y - treasures[b].y;
    }
  }
  return dpt[a][b];
}
int n, m, k, q;
int main() {
  int a, b, c;
  memset(dpt, -1, sizeof dpt);
  memset(tmp, -1, sizeof tmp);
  scanf("%d %d %d %d", &n, &m, &k, &q);
  for (int i = 0; i < k; i++) {
    scanf("%d %d", &a, &b);
    if (tmp[a].first == -1)
      tmp[a] = {b, b};
    else
      tmp[a] = {min(tmp[a].first, b), max(tmp[a].second, b)};
  }
  for (int i = 0; i < 200010; i++) {
    if (tmp[i].first != -1)
      treasures.push_back({i, tmp[i].first, tmp[i].second});
  }
  for (int i = 0; i < q; i++) {
    scanf("%d", &a);
    columns.insert(a);
  }
  if (treasures[0].y == 1) {
    int c1 = treasures[0].minx - 1, c2 = treasures[0].maxx - 1;
    printf("%lld\n", min(c1 + dp(0, 0), c2 + dp(1, 0)));
  } else {
    int x = 1, y = 0;
    int c1 = min(abs(getPrev(x) - x) + abs(treasures[y].minx - getPrev(x)),
                 abs(getNext(x) - x) + abs(treasures[y].minx - getNext(x)));
    int c2 = min(abs(getPrev(x) - x) + abs(treasures[y].maxx - getPrev(x)),
                 abs(getNext(x) - x) + abs(treasures[y].maxx - getNext(x)));
    printf("%lld\n", min(c1 + dp(0, 0), c2 + dp(1, 0)) + treasures[y].y - 1);
  }
  return 0;
}
