#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream F("magazin.in");
ofstream G("magazin.out");
const int Nmax = 30010;
const int Pmax = 50010;
const int Mmax = 30;
const int oo = 1<<30;
int N,M,P,D;
int C[Nmax][6];
vector<int> A[Nmax];
int V[Nmax][5];
void Prec()
{
for (int i=0;i<N;++i)
sort( A[i].begin() , A[i].end() );
for (int i=0;i<N;++i)
{
if ( !A[i].size() )
{
V[i][1] = V[i][2] = D;
V[i][3] = 3*D;
continue;
}
int last = int( A[i].size() ) - 1;
V[i][1] = 2 * A[i][last] + D;
V[i][2] = 2 * ( M-A[i][0]+1 ) + D;
V[i][3] = min(V[i][1], V[i][2])+2*D;
for (int j=0;j<int( A[i].size() )-1;++j)
V[i][3] = min( V[i][3] , 2*( M-A[i][j+1]+1 + A[i][j] ) + 3*D );
}
}
void NUL(int i)
{
C[i][0] = min(C[i][0], C[i-1][0] + V[i][1]);
C[i][0] = min(C[i][0], C[i-1][1] + V[i][1]);
C[i][0] = min(C[i][0], C[i-1][2] + 2*(M+1) + V[i][1]);
C[i][0] = min(C[i][0], C[i-1][3] + (M+1) + V[i][1]);
C[i][0] = min(C[i][0], C[i-1][4] + (M+1) + V[i][1]);
C[i][0] = min(C[i][0], C[i-1][5] + (M+1) + V[i][1]);
}
void ONE(int i)
{
C[i][1] = min(C[i][1], C[i-1][0] + D + 2*(M+1));
C[i][1] = min(C[i][1], C[i-1][1] + min( min( V[i][1],V[i][2] )+2*D, V[i][3] ));
C[i][1] = min(C[i][1], C[i-1][2] + D + 2*(M+1));
C[i][1] = min(C[i][1], C[i-1][3] + D + (M+1));
C[i][1] = min(C[i][1], C[i-1][4] + D + (M+1));
C[i][1] = min(C[i][1], C[i-1][5] + 3*D + (M+1));
}
void TWO(int i)
{
C[i][2] = min(C[i][2], C[i-1][0] + min(V[i][2], V[i][3]-2*D));
C[i][2] = min(C[i][2], C[i-1][1] + min(V[i][2], V[i][3]-2*D));
C[i][2] = min(C[i][2], C[i-1][2] + min(min(V[i][1], V[i][2])+2*D, V[i][3]));
C[i][2] = min(C[i][2], C[i-1][3] + min(V[i][2], V[i][3]-2*D) + (M+1));
C[i][2] = min(C[i][2], C[i-1][4] + min(V[i][2], V[i][3]-2*D) + (M+1));
C[i][2] = min(C[i][2], C[i-1][5] + min(V[i][2], V[i][3]-2*D) + (M+1));
}
void THR(int i)
{
C[i][3] = min(C[i][3], C[i-1][3] + V[i][2]);
C[i][3] = min(C[i][3], C[i-1][4] + V[i][2]);
C[i][3] = min(C[i][3], C[i-1][5] + 2*(M+1) + V[i][2]);
C[i][3] = min(C[i][3], C[i-1][0] + (M+1) + V[i][2]);
C[i][3] = min(C[i][3], C[i-1][1] + (M+1) + V[i][2]);
C[i][3] = min(C[i][3], C[i-1][2] + (M+1) + V[i][2]);
}
void FOU(int i)
{
C[i][4] = min(C[i][4], C[i-1][3] + D + 2*(M+1));
C[i][4] = min(C[i][4], C[i-1][4] + min(min(V[i][1], V[i][2])+2*D, V[i][3]));
C[i][4] = min(C[i][4], C[i-1][5] + D + 2*(M+1));
C[i][4] = min(C[i][4], C[i-1][0] + D + (M+1));
C[i][4] = min(C[i][4], C[i-1][1] + D + (M+1));
C[i][4] = min(C[i][4], C[i-1][2] + 3*D + (M+1));
}
void FIV(int i)
{
C[i][5] = min(C[i][5], C[i-1][3] + min(V[i][1], V[i][3]-2*D));
C[i][5] = min(C[i][5], C[i-1][4] + min(V[i][1], V[i][3]-2*D));
C[i][5] = min(C[i][5], C[i-1][5] + min(min(V[i][1], V[i][2])+2*D, V[i][3]));
C[i][5] = min(C[i][5], C[i-1][0] + min(V[i][1], V[i][3]-2*D) + (M+1));
C[i][5] = min(C[i][5], C[i-1][1] + min(V[i][1], V[i][3]-2*D) + (M+1));
C[i][5] = min(C[i][5], C[i-1][2] + min(V[i][1], V[i][3]-2*D) + (M+1));
}
int main()
{
F>>P>>N>>M>>D;
for (int i=1;i<=P;++i)
{
int x,y;
F>>x>>y; x--;
A[x].push_back( y );
}
Prec();
memset(C, 0x3f, sizeof(C));
C[0][0] = V[0][1]-D;
C[0][1] = 2*(M+1);
C[0][2] = min(V[0][2]-D, V[0][3]-3*D);
C[0][3] = oo;
C[0][4] = M+1;
C[0][5] = oo;
for (int i=1;i<N;++i)
{
NUL( i ), ONE( i ), TWO( i );
THR( i ), FOU( i ), FIV( i );
}
int Res = min(C[N-1][0], C[N-1][1]);
G<<Res<<'\n';
F.close();
G.close();
return 0;
}