
/*
按坐标排序
以餐厅为起点向两边扩展区间
dp[i][j][0]表示送完区间[i,j]的饭后停留在左边的代价
dp[i][j][1]表示送完区间[i,j]的饭后停留在右边的代价
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct A{int x,v;}p[];
int cmp(A a,A b){return a.x<b.x;}
int sum[],dp[][][],n,v,x;//代价,坐标 int main(){
while(cin>>n>>v>>x){
for(int i=;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].v);
p[n+].x=x,p[n+].v=;
sort(p+,p+n+,cmp); int pos;//找餐厅
for(int i=;i<=n+;i++)
if(p[i].x==x){pos=i;break;}
memset(sum,,sizeof sum);
for(int i=;i<=n+;i++)
sum[i]=sum[i-]+p[i].v; memset(dp,0x3f,sizeof dp);
dp[pos][pos][]=dp[pos][pos][]=;
for(int i=pos;i>=;i--)
for(int j=pos;j<=n+;j++){
if(i==j)continue;
int delay=sum[i-]+sum[n+]-sum[j];
dp[i][j][]=min(dp[i+][j][]+(p[i+].x-p[i].x)*(delay+p[i].v),//从i+1走到i
dp[i+][j][]+(p[j].x-p[i].x)*(delay+p[i].v));//从j走到i
dp[i][j][]=min(dp[i][j-][]+(p[j].x-p[i].x)*(delay+p[j].v),//从i走到j
dp[i][j-][]+(p[j].x-p[j-].x)*(delay+p[j].v));//从j-1走到j
}
printf("%d\n",min(dp[][n+][],dp[][n+][])*v);
}
}