#include <bits/stdc++.h>   #pragma GCC optimize(2)   #pragma GCC optimize(3)   #pragma GCC optimize(4)   using namespace std;   const int N = 2e5 + 7;   const int inf = 0x3f3f3f3f;   const long long INF = 0x3f3f3f3f3f3f3f3f;   const int mod = 998244353;   const double eps = 1e-8;   const double PI = acos(-1);   template <class T, class S>   inline void add(T &a, S b) {     a += b;     if (a >= mod) a -= mod;   }   template <class T, class S>   inline void sub(T &a, S b) {     a -= b;     if (a < 0) a += mod;   }   template <class T, class S>   inline bool chkmax(T &a, S b) {     return a < b ? a = b, true : false;   }   template <class T, class S>   inline bool chkmin(T &a, S b) {     return a > b ? a = b, true : false;   }   mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());   int n, m, k, q;   int mx[N], mn[N];   int cnt;   int tot[N];   map<int, long long> Map[N];   vector<int> V;   int calc(int p, int p1, int p2) { return abs(p - p1) + abs(p1 - p2); }   int main() {     memset(mx, 0xc0, sizeof(mx));     memset(mn, 0x3f, sizeof(mn));     scanf( %d%d%d%d , &n, &m, &k, &q);     for (int i = 1; i <= k; i++) {       int r, c;       scanf( %d%d , &r, &c);       chkmax(mx[r], c);       chkmin(mn[r], c);       tot[r]++;       cnt++;     }     if (!cnt) {       puts( 0 );       return 0;     }     while (!tot[n]) n--;     V.push_back(0);     V.push_back(m + 1);     for (int i = 1; i <= q; i++) {       int b;       scanf( %d , &b);       V.push_back(b);     }     sort((V).begin(), (V).end());     if (tot[1]) {       Map[1][mx[1]] = mx[1] - 1;     } else {       Map[1][1] = 0;     }     for (int i = 1; i < n; i++) {       assert(((int)Map[i].size()) <= 2);       int d = 1;       int cur = i;       while (!tot[i + 1]) {         i++;         d++;       }       for (auto &t : Map[cur]) {         int p = t.first;         long long val = t.second;         int pos = lower_bound((V).begin(), (V).end(), p) - V.begin();         if (V[pos] != m + 1) {           long long dis = abs(V[pos] - p) + d;           long long nVal = calc(V[pos], mn[i + 1], mx[i + 1]);           if (!Map[i + 1].count(mx[i + 1])) {             Map[i + 1][mx[i + 1]] = val + dis + nVal;           } else {             chkmin(Map[i + 1][mx[i + 1]], val + dis + nVal);           }           nVal = calc(V[pos], mx[i + 1], mn[i + 1]);           if (!Map[i + 1].count(mn[i + 1])) {             Map[i + 1][mn[i + 1]] = val + dis + nVal;           } else {             chkmin(Map[i + 1][mn[i + 1]], val + dis + nVal);           }         }         pos--;         if (V[pos] != 0) {           long long dis = abs(V[pos] - p) + d;           long long nVal = calc(V[pos], mn[i + 1], mx[i + 1]);           if (!Map[i + 1].count(mx[i + 1])) {             Map[i + 1][mx[i + 1]] = val + dis + nVal;           } else {             chkmin(Map[i + 1][mx[i + 1]], val + dis + nVal);           }           nVal = calc(V[pos], mx[i + 1], mn[i + 1]);           if (!Map[i + 1].count(mn[i + 1])) {             Map[i + 1][mn[i + 1]] = val + dis + nVal;           } else {             chkmin(Map[i + 1][mn[i + 1]], val + dis + nVal);           }         }       }       Map[cur].clear();     }     long long ans = INF;     for (auto &t : Map[n]) {       chkmin(ans, t.second);     }     printf( %lld n , ans);     return 0;   }