#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define infile "magazin.in"
#define outfile "magazin.out"
#define PMAX 50005
#define INF 1000000000
FILE *fin,*fout;
struct poz{int x,y;};
poz p[PMAX];
int P,N,M,D;
int bestsol=INF;
int st[PMAX],used[PMAX];
int suma;
void citire()
{
int i;
fin=fopen(infile,"r");
fscanf(fin,"%d %d %d %d",&P,&N,&M,&D);
for(i=0;i<P;i++)
fscanf(fin,"%d %d",&p[i].x,&p[i].y);
fclose(fin);
}
inline int min(int x, int y)
{
return (x<y)?x:y;
}
inline int dist_min(int x1, int y1, int x2, int y2)
{
return min(abs(x1-x2)*D+(M-y1+1)+(M-y2+1),abs(x1-x2)*D+(y1)+(y2));
}
/*
void constr_retea()
{
int i,j;
}
*/
void back(int k)
{
if(k==P)
{
// verificare
if(st[0]==1 && st[1]==2 && st[2]==3)
int ok=1;
suma+=dist_min(N,0,p[st[k-1]].x,p[st[k-1]].y);
if(suma<bestsol)
bestsol=suma;
suma-=dist_min(N,0,p[st[k-1]].x,p[st[k-1]].y);
return;
}
if(!k)
suma=0;
for(st[k]=0;st[k]<P;st[k]++)
if(!used[st[k]])
{
used[st[k]]=1;
if(!k)
suma+=dist_min(1,0,p[st[k]].x,p[st[k]].y);
else
suma+=dist_min(p[st[k-1]].x,p[st[k-1]].y,p[st[k]].x,p[st[k]].y);
back(k+1);
if(!k)
suma-=dist_min(1,0,p[st[k]].x,p[st[k]].y);
else
suma-=dist_min(p[st[k-1]].x,p[st[k-1]].y,p[st[k]].x,p[st[k]].y);
used[st[k]]=0;
}
}
int main()
{
citire();
//constr_retea();
for(int i=0;i<P;i++)
used[i]=0;
back(0);
fout=fopen(outfile,"w");
fprintf(fout,"%d\n",bestsol);
fclose(fout);
return 0;
}