#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
double dis, p;
}stations[510];
int cmp(node n1, node n2)
{
return n1.dis < n2.dis;
}
int main()
{
double cmax, d, davg;
int n;
scanf("%lf%lf%lf%d", &cmax, &d, &davg, &n);
int i;
for(i = 1; i <= n; i++)
{
scanf("%lf%lf", &stations[i].p, &stations[i].dis);
}
sort(stations + 1, stations + n + 1, cmp);
double max = 0, flag = 1, cha, tankmaxrun = cmax * davg;
if(stations[1].dis > 0)
{
flag = 0;
}
else
{
for(i = 1; i <= n - 1; i++)
{
cha = stations[i + 1].dis - stations[i].dis - tankmaxrun;
if(cha > 0)
{
max = stations[i].dis + tankmaxrun;
flag = 0;
break;
}
}
if(flag == 1)
{
cha = d - stations[n].dis - tankmaxrun;
if(cha > 0)
{
max = stations[n].dis + tankmaxrun;
flag = 0;
}
}
}
if(flag == 0)
{
printf("The maximum travel distance = %.2lf\n", max);
return 0;
}
double cost = 0, tank = 0, need, curp;
int j, index;
for(i = 1; i <= n - 1; i++)
{
cha = stations[i + 1].dis - stations[i].dis - tank * davg;
curp = stations[i].p;
if(cha > 0)
{
need = cha / davg;
cost += need * curp;
tank += need;
}
if(tank < cmax)
{
max = stations[i].dis + tankmaxrun;
index = -1;
for(j = i + 1; j <= n && stations[j].dis <= max; j++)
{
if(stations[j].p <= curp)
{
index = j;
break;
}
}
need = 0;
if(index == -1)
{
if(max >= d)
{
cha = d - stations[i].dis - tank * davg;
need = cha / davg;
}
else
{
need = cmax - tank;
}
}
else
{
cha = stations[index].dis - stations[i].dis - tank * davg;
if(cha > 0)
{
need = cha / davg;
}
}
cost += need * curp;
tank += need;
}
cha = stations[i + 1].dis - stations[i].dis;
tank -= cha / davg;
}
cha = d - stations[n].dis - tank * davg;
cost += cha / davg * stations[n].p;
printf("%.2lf\n", cost);
system("pause");
return 0;
}