#include<stdlib.h>
#include<stdio.h>
#include<queue>
using namespace std;
long partition(long v[2][100000],long left,long right,long index)
{
long pivotValue=v[0][index];
long aux,i;
aux=v[0][right];
v[0][right]=v[0][index];
v[0][index]=aux;
aux=v[1][right];
v[1][right]=v[1][index];
v[1][index]=aux;
long storeIndex=left;
for (i=left;i<right;i++)
if (v[0][i]>pivotValue)
{
aux=v[0][i];
v[0][i]=v[0][storeIndex];
v[0][storeIndex]=aux;
aux=v[1][i];
v[1][i]=v[1][storeIndex];
v[1][storeIndex]=aux;
storeIndex++;
}
aux=v[0][storeIndex];
v[0][storeIndex]=v[0][right];
v[0][right]=aux;
aux=v[1][storeIndex];
v[1][storeIndex]=v[1][right];
v[1][right]=aux;
return storeIndex;
}
void quicksort(long v[2][100000],long left,long right)
{
long pivot,pivotNew;
if (left<right)
{
pivot=(left+right)/2;
pivotNew=partition(v,left,right,pivot);
quicksort(v,left,pivotNew-1);
quicksort(v,pivotNew+1,right);
}
}
int main()
{
FILE *f,*o;
f=fopen("gutui.in","r");
o=fopen("gutui.out","w");
long N,H,U;
fscanf(f,"%li",&N);
fscanf(f,"%li",&H); //citesc N,H,U
fscanf(f,"%li",&U);
long i=0,g,h;
long v[2][100000];
priority_queue< long,vector<long>,greater<long> > sol; //sol e vectorul de solutii partiale
while (fscanf(f,"%li%li",&h,&g)!=EOF) //pe prima linie din v pun inaltimile, pe a 2-a linie pun greutatile
{
v[0][i]=h;
v[1][i]=g;
i++;
}
quicksort(v,0,N-1); //sortez vectorul dupa inaltime, descrescator
long H2=H,k=0,min,j,poz;
for (i=0;i<N;i++)
{
if (v[0][i]<=H2)
{
sol.push(v[1][i]);
H2=H2-U;
}
else
if (sol.top()<v[1][i])
{
sol.pop();
sol.push(v[1][i]);
}
}
long sum=0;
while(!sol.empty())
{
sum=sum+sol.top();
sol.pop();
}
fprintf(o,"%li\n",sum);
fclose(f);
fclose(o);
return 0;
}