# include <algorithm>
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std;
const char *FIN = "magazin.in", *FOU = "magazin.out";
const int MAX = 30005, oo = 0x3f3f3f3f;
vector <int> G[MAX];
int P, N, M, D, A[3][MAX], dp[MAX][6];
void caz (int i, int CAZ) {
if (CAZ == 0) {
dp[i][0] = min (dp[i][0], dp[i - 1][0] + A[0][i]);
dp[i][0] = min (dp[i][0], dp[i - 1][1] + A[0][i]);
dp[i][0] = min (dp[i][0], dp[i - 1][2] + 2 * (M + 1) + A[0][i]);
dp[i][0] = min (dp[i][0], dp[i - 1][3] + (M + 1) + A[0][i]);
dp[i][0] = min (dp[i][0], dp[i - 1][4] + (M + 1) + A[0][i]);
dp[i][0] = min (dp[i][0], dp[i - 1][5] + (M + 1) + A[0][i]);
} else if (CAZ == 1) {
dp[i][1] = min (dp[i][1], dp[i - 1][0] + D + 2 * (M + 1));
dp[i][1] = min (dp[i][1], dp[i - 1][1] + min (min (A[0][i],A[1][i]) + 2 * D, A[2][i]));
dp[i][1] = min (dp[i][1], dp[i - 1][2] + D + 2 * (M + 1));
dp[i][1] = min (dp[i][1], dp[i - 1][3] + D + (M + 1));
dp[i][1] = min (dp[i][1], dp[i - 1][4] + D + (M + 1));
dp[i][1] = min (dp[i][1], dp[i - 1][5] + 3 * D + (M + 1));
} else if (CAZ == 2) {
dp[i][2] = min (dp[i][2], dp[i - 1][0] + min (A[1][i], A[2][i] - 2 * D));
dp[i][2] = min (dp[i][2], dp[i - 1][1] + min (A[1][i], A[2][i] - 2 * D));
dp[i][2] = min (dp[i][2], dp[i - 1][2] + min (min (A[0][i], A[1][i]) + 2 * D, A[2][i]));
dp[i][2] = min (dp[i][2], dp[i - 1][3] + min (A[1][i], A[2][i] - 2 * D) + (M + 1));
dp[i][2] = min (dp[i][2], dp[i - 1][4] + min (A[1][i], A[2][i] - 2 * D) + (M + 1));
dp[i][2] = min (dp[i][2], dp[i - 1][5] + min (A[1][i], A[2][i] - 2 * D) + (M + 1));
} else if (CAZ == 3) {
dp[i][3] = min (dp[i][3], dp[i - 1][3] + A[1][i]);
dp[i][3] = min (dp[i][3], dp[i - 1][4] + A[1][i]);
dp[i][3] = min (dp[i][3], dp[i - 1][5] + 2 * (M + 1) + A[1][i]);
dp[i][3] = min (dp[i][3], dp[i - 1][0] + (M + 1) + A[1][i]);
dp[i][3] = min (dp[i][3], dp[i - 1][1] + (M + 1) + A[1][i]);
dp[i][3] = min (dp[i][3], dp[i - 1][2] + (M + 1) + A[1][i]);
} else if (CAZ == 4) {
dp[i][4] = min (dp[i][4], dp[i - 1][0] + D + (M + 1));
dp[i][4] = min (dp[i][4], dp[i - 1][1] + D + (M + 1));
dp[i][4] = min (dp[i][4], dp[i - 1][2] + 3 * D + (M + 1));
dp[i][4] = min (dp[i][4], dp[i - 1][3] + D + 2 * (M + 1));
dp[i][4] = min (dp[i][4], dp[i - 1][4] + min (min (A[0][i], A[1][i]) + 2 * D, A[2][i]));
dp[i][4] = min (dp[i][4], dp[i - 1][5] + D + 2 * (M + 1));
} else if (CAZ == 5) {
dp[i][5] = min (dp[i][5], dp[i - 1][0] + min (A[0][i], A[2][i] - 2 * D) + (M + 1));
dp[i][5] = min (dp[i][5], dp[i - 1][1] + min (A[0][i], A[2][i] - 2 * D) + (M + 1));
dp[i][5] = min (dp[i][5], dp[i - 1][2] + min (A[0][i], A[2][i] - 2 * D) + (M + 1));
dp[i][5] = min (dp[i][5], dp[i - 1][3] + min (A[0][i], A[2][i] - 2 * D));
dp[i][5] = min (dp[i][5], dp[i - 1][4] + min (A[0][i], A[2][i] - 2 * D));
dp[i][5] = min (dp[i][5], dp[i - 1][5] + min (min (A[0][i], A[1][i]) + 2 * D, A[2][i]));
}
}
int main (void) {
freopen (FIN, "r", stdin) ;
scanf ("%d %d %d %d", &P, &N, &M, &D);
for (int i = 0, x, y; i < P; ++i) {
scanf ("%d %d", &x, &y) ;
G[--x].push_back (y) ;
}
for (int i = 0; i < N; ++i)
sort (G[i].begin (), G[i].end ()) ;
for (int i = 0; i < N; ++i) {
if (G[i].empty ()) {
A[0][i] = A[1][i] = D, A[2][i] = 3 * D;
continue ;
}
A[0][i] = D + 2 * G[i][G[i].size () - 1];
A[1][i] = D + 2 * (M + 1 - G[i][0]) ;
A[2][i] = min (A[0][i], A[1][i]) + 2 * D;
for (int j = 0, k = G[i].size () - 1; j < k; ++j)
A[2][i] = min (A[2][i], 2 * G[i][j] + 2 * (M + 1 - G[i][j + 1]) + 3 * D);
}
memset (dp, 0x3f, sizeof (dp)) ;
dp[0][0] = A[0][0] - D, dp[0][1] = 2 * (M + 1), dp[0][2] = min (A[1][0] - D, A[2][0] - 3 * D);
dp[0][3] = dp[0][5] = oo, dp[0][4] = M + 1;
for (int i = 1; i < N; ++i)
caz (i, 0), caz (i, 1), caz (i, 2), caz (i, 3), caz (i, 4), caz (i, 5);
fprintf (fopen (FOU, "w"), "%d", min (dp[N - 1][0], dp[N - 1][1])) ;
}