#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 30050
#define MAXM 26
#define MAXP 50050
#define inf 0x3f3f3f3f
using namespace std;
struct coord
{
int x, y;
coord(int x = 0, int y = 0) : x(x), y(y) { }
};
coord want[MAXP];
int din[MAXN][10];
int culoar[MAXN][MAXM];
int tj[MAXN], ts[MAXN], parti[MAXN];
int p, n, m, d;
void prepare()
{
for (int i = 1; i <= n; i++) {
if (culoar[i][0] < 1) {
tj[i] = d;
ts[i] = d;
parti[i] = 2*d;
continue;
}
sort(culoar[i]+1, culoar[i] + culoar[i][0]+1);
tj[i] = d+2*culoar[i][culoar[i][0]];
ts[i] = d+2*(m+1-culoar[i][1]);
parti[i] = d + min(tj[i]+d, ts[i]+d);
for (int j = 1; j <= culoar[i][0]; j++) {
parti[i] = min(parti[i], 2*d + 2*(culoar[i][j]+m+1-culoar[i][j+1]));
}
}
}
void solve()
{
for (int i = 0; i <= n; i++)
for (int j = 0; j < 6; j++)
din[i][j] = inf;
din[1][0] = tj[1]-d;
din[1][1] = 2*(m+1);
din[1][2] = min(ts[1]-d, parti[1]-3*d);
din[1][4] = m+1;
for (int i = 2; i <= n; i++) {
din[i][0] = min(din[i][0], din[i-1][0] + tj[i]);
din[i][0] = min(din[i][0], din[i-1][1] + tj[i]);
din[i][0] = min(din[i][0], din[i-1][2] + 2*(m+1)+tj[i]);
din[i][0] = min(din[i][0], din[i-1][3] + m+1+tj[i]);
din[i][0] = min(din[i][0], din[i-1][4] + m+1+tj[i]);
din[i][0] = min(din[i][0], din[i-1][5] + m+1+tj[i]);
din[i][1] = min(din[i][1], din[i-1][0] + d + 2*(m+1));
din[i][1] = min(din[i][1], din[i-1][1] + min(parti[i]+d, 2*d + min(ts[i], tj[i])));
din[i][1] = min(din[i][1], din[i-1][2] + d + 2*(m+1));
din[i][1] = min(din[i][1], din[i-1][3] + d + (m+1));
din[i][1] = min(din[i][1], din[i-1][4] + d + (m+1));
din[i][1] = min(din[i][1], din[i-1][5] + 3*d + (m+1));
din[i][2] = min(din[i][2], din[i-1][0] + min(ts[i], parti[i]-d));
din[i][2] = min(din[i][2], din[i-1][1] + min(ts[i], parti[i]-d));
din[i][2] = min(din[i][2], din[i-1][2] + min(parti[i]+d, 2*d + min(ts[i], tj[i])));
din[i][2] = min(din[i][2], din[i-1][3] + min(ts[i], parti[i]-d) + m+1);
din[i][2] = min(din[i][2], din[i-1][4] + min(ts[i], parti[i]-d) + m+1);
din[i][2] = min(din[i][2], din[i-1][5] + min(ts[i], parti[i]-d) + m+1);
din[i][3] = min(din[i][3], din[i-1][0] + m+1 + ts[i]);
din[i][3] = min(din[i][3], din[i-1][1] + m+1 + ts[i]);
din[i][3] = min(din[i][3], din[i-1][2] + m+1 + ts[i]);
din[i][3] = min(din[i][3], din[i-1][3] + ts[i]);
din[i][3] = min(din[i][3], din[i-1][4] + ts[i]);
din[i][3] = min(din[i][3], din[i-1][5] + 2*(m+1) + ts[i]);
din[i][4] = min(din[i][4], din[i-1][0] + d + m + 1);
din[i][4] = min(din[i][4], din[i-1][1] + d + m + 1);
din[i][4] = min(din[i][4], din[i-1][2] + 3*d + m+1);
din[i][4] = min(din[i][4], din[i-1][3] + d + 2*(m+1));
din[i][4] = min(din[i][4], din[i-1][4] + min(parti[i]+d, 2*d + min(ts[i], tj[i])));
din[i][4] = min(din[i][4], din[i-1][5] + d + 2*(m+1));
din[i][5] = min(din[i][5], din[i-1][0] + min(tj[i], parti[i]-d) + m+1);
din[i][5] = min(din[i][5], din[i-1][1] + min(tj[i], parti[i]-d) + m+1);
din[i][5] = min(din[i][5], din[i-1][2] + min(tj[i], parti[i]-d) + m+1);
din[i][5] = min(din[i][5], din[i-1][3] + min(tj[i], parti[i]-d));
din[i][5] = min(din[i][5], din[i-1][4] + min(tj[i], parti[i]-d));
din[i][5] = min(din[i][5], din[i-1][5] + min(parti[i]+d, 2*d + min(ts[i], tj[i])));
}
printf("%d", min(din[n][0], din[n][1]));
}
int main()
{
freopen("magazin.in", "r", stdin);
freopen("magazin.out", "w", stdout);
scanf("%d %d %d %d", &p, &n, &m, &d);
for (int i = 1; i <= p; i++) {
scanf("%d %d", &want[i].x, &want[i].y);
culoar[want[i].x][++culoar[want[i].x][0]] = want[i].y;
}
prepare();
solve();
return 0;
}