#include<stdio.h>
#include<stdlib.h>
typedef struct{
int h, g, niv;
}gutui;
void quickSort1(gutui *vect, int stanga, int dreapta) {
int i = stanga, j = dreapta;
int tmp1, tmp2, tmp3;
int pivot = vect[dreapta].niv;
while (i <= j){
while (vect[i].niv < pivot)
i++;
while (vect[j].niv > pivot)
j--;
if (i <= j){
tmp1=vect[i].niv;
vect[i].niv=vect[j].niv;
vect[j].niv=tmp1;
tmp2=vect[i].h;
vect[i].h=vect[j].h;
vect[j].h=tmp2;
tmp3=vect[i].g;
vect[i].g=vect[j].g;
vect[j].g=tmp3;
i++;
j--;
}
}
if (stanga < j)
quickSort1(vect, stanga, j);
if (i < dreapta)
quickSort1(vect, i, dreapta);
}
void quickSort2(gutui *vect, int stanga, int dreapta) {
int i = stanga, j = dreapta;
int tmp1, tmp2, tmp3;
int pivot = vect[dreapta].g;
while (i <= j){
while (vect[i].g > pivot)
i++;
while (vect[j].g < pivot)
j--;
if (i <= j){
tmp1=vect[i].niv;
vect[i].niv=vect[j].niv;
vect[j].niv=tmp1;
tmp2=vect[i].h;
vect[i].h=vect[j].h;
vect[j].h=tmp2;
tmp3=vect[i].g;
vect[i].g=vect[j].g;
vect[j].g=tmp3;
i++;
j--;
}
}
if (stanga < j)
quickSort2(vect, stanga, j);
if (i < dreapta)
quickSort2(vect, i, dreapta);
}
void quickSort(int *vect, int stanga, int dreapta) {
int i = stanga, j = dreapta;
int tmp;
int pivot = vect[dreapta];
while (i <= j) {
while (vect[i] > pivot)
i++;
while (vect[j] < pivot)
j--;
if (i <= j) {
tmp = vect[i];
vect[i] =vect[j];
vect[j] = tmp;
i++;
j--;
}
}
if (stanga < j)
quickSort(vect, stanga, j);
if (i < dreapta)
quickSort(vect, i, dreapta);
}
int main(){
int n, h, u, i, j, k, *a, nivele, suma=0, t, aux, max;
gutui *gut;
FILE *fo, *fc;
fo=fopen("gutui.in", "r");
fscanf(fo,"%d%d%d", &n, &h, &u);
gut=(gutui*)malloc(n*sizeof(gutui));
a=(int*)malloc(n*sizeof(int));
nivele=h/u+1;
for(i=0;i<n;i++){
fscanf(fo,"%d%d", &gut[i].h, &gut[i].g);
if(gut[i].h%u)
gut[i].niv=nivele-gut[i].h/u-1;
else
gut[i].niv=nivele-gut[i].h/u;
}
fclose(fo);
quickSort1(gut,0,n-1);
i=0;
for(j=0;j<n;j++){
if(gut[i].niv!=gut[j].niv){
quickSort2(gut,i,j-1);
i=j;
}
}
quickSort2(gut,i,n-1);
max=gut[n-1].niv;
/*
for(i=0;i<n;i++)
printf("%d\t", gut[i].g);
printf("\n");
printf("\nmaxim %d\n", max);
for(i=0;i<n;i++)
printf("%d\t", gut[i].h);
printf("\n");
for(i=0;i<n;i++)
printf("%d\t", gut[i].niv);
printf("\n");
printf("\n");
*/
k=0;
t=0;
i=0;
aux=0;
while(i<n){
k=gut[i].niv;
j=0;
while(j<k && gut[i+j].niv==k){
a[t]=gut[i+j].g;
t++;
j++;
}
i=i+j;
while(k==gut[i].niv){
i++;
}
}
//printf("\n%d %d \n", t, n);
/*
k=0;
t=0;
i=0;
while(i<n){
k=0;
for(j=0;j<gut[i].niv;j++)
if(gut[i].niv==gut[i+j].niv)
a[t++]=gut[i+j].g;
else{
k=1;
break;
}
if(k==0){
while(gut[i+j-1].niv==gut[i+j].niv && (i+j)<n)
j++;
i=i+j;
}
else
i=i+j;
}
printf("\n%d %d \n", t, n);
*/
quickSort(a,0,n-1);
//for(i=0;i<t;i++)
// printf("%d ", a[i]);
//printf("\n");
//printf("\nt=%d\n", t);
for(i=0;i<max && i<t;i++)
suma=suma+a[i];
//printf("%d\n",suma);
fc=fopen("gutui.out", "w");
fprintf(fc,"%d\n",suma);
fclose(fc);
free(gut);
free(a);
return 0;
}