#include<bits/stdc++.h>
using namespace std;
struct Node{
double dis;
double price;
};
bool cmp(Node a,Node b){
return a.dis<b.dis;
}
bool cmp1(Node a,Node b){
return a.price<b.price;
}
int main()
{
//freopen("in.txt","r",stdin);
double cmax,d,davg,n;
cin>>cmax>>d>>davg>>n;
vector<Node> station;
station.resize(n);
for(int i=0;i<n;i++){
cin>>station[i].price>>station[i].dis;
}
Node l;l.dis=d;l.price=0;
station.push_back(l);//终点也作为一个加油站
sort(station.begin(),station.end(),cmp);//按距离远近排序
Node nowstation=station[0];
double distance=0;//当前位置
double tank=0;//到达某站点时刻的油箱油量
double cost=0;//到达某站点时刻花费
double limitd=cmax*davg;//加满油能跑的距离
if(nowstation.dis>0){//如果最近的站点不在原点就直接结束
printf("The maximum travel distance = 0.00");return 0;
}
while(distance<d){//当前位置未到终点就继续循环
vector<Node> ppp,ttt;//维护两个容器,ppp是limited以内price小于nowstation价格的站点,ttt是limited以内的所有站点
for(int i=0;i<station.size();i++){
if(station[i].dis-distance<=limitd&&station[i].dis-distance>0){
ttt.push_back(station[i]);
if(station[i].price<nowstation.price){
ppp.push_back(station[i]);
}
}
}
if(ppp.size()>0){//如果limited以内有价格更小的站点
if(tank*davg+nowstation.dis<ppp[0].dis){//如果油箱当前油量不够走到这个价格更小的站点
cost+=(ppp[0].dis-(nowstation.dis+tank*davg))*nowstation.price/davg;
tank=0;
distance=ppp[0].dis;
nowstation=ppp[0];
}else{//如果邮箱内的油量足够走到这个价格更小的站点
tank-=((ppp[0].dis-nowstation.dis)/davg);
distance=ppp[0].dis;
nowstation=ppp[0];
}
}else{//如果limited以内没有价格更小的站点
if(ttt.size()>0){//如果limited以内还有站点
sort(ttt.begin(),ttt.end(),cmp1);//选择这些站点中的价格最小的站点
cost+=((cmax-tank)*nowstation.price);//当前站点加满油
tank=cmax-(ttt[0].dis-nowstation.dis)/davg;//到达那个价格最小的站点(虽然最小但依旧大于当前站点价格),计算到达时刻油箱油量
distance=ttt[0].dis;
nowstation=ttt[0];
}else{//如果limited以内没有站点就加满油,计算走的最远距离,结束
distance+=cmax*davg;break;
}
}
}
if(distance<d){//结束
printf("The maximum travel distance = %.2lf",distance);
}else{
printf("%.2lf",cost);
}
return 0;
}