#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;
//citire
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));
for(i=0;i<n;i++){
fscanf(fo,"%d%d", &gut[i].h, &gut[i].g);
gut[i].niv=(h-gut[i].h)/u+1;
if(gut[i].h>h || gut[i].h<0)
gut[i].niv=0;
}
fclose(fo);
//sortare dupa nivelul la care se afla gutuile
quickSort1(gut,0,n-1);
//sortare dupa greutatea gutuilor in functie de nivelul la care se afla
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);
//nivelul maxim al unei gutui
max=gut[n-1].niv;
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++;
}
}
//sortarea descrescatoare vectorului cu elemente viabile
quickSort(a,0,n-1);
//calculul greutatii totale a gutuilor
for(i=0;i<max && i<t;i++)
suma=suma+a[i];
//scriere in fisier
fc=fopen("gutui.out", "w");
fprintf(fc,"%d\n",suma);
fclose(fc);
//eliberare memorie
free(gut);
free(a);
return 0;
}