#include <stdio.h>
#include <stdlib.h>
//Merge Sort
void mergeSort (int v[], int m[],int v2[], int v3[], int st, int dr) {
int mij, p, k, st2, elem;
if (dr > st) {
mij = (st + dr) / 2;
// se apeleaza recursiv functia pentru cele 2 jumatati
mergeSort (v, m, v2, v3, st, mij);
mergeSort (v, m, v2, v3, mij + 1, dr);
mij ++;
st2 = mij - 1;
k = st;
elem = dr - st + 1;
// se face interclasarea elementelor din prima si a doua jumatate a vectorului in unl temporar
// pana cand s-au epuizat elementele din una dintre ele
while ((st <= st2) && (mij <= dr)) {
if (v[st] >= v[mij]) {
v2[k] = v[st];
v3[k] = m[st];
k ++;
st ++;
}
else {
v2[k] = v[mij];
v3[k] = m[mij];
k ++;
mij ++;
}
}
// se copiaza restul elementelor in vectorul temporar
while (st <= st2) {
v2[k] = v[st];
v3[k] = m[st];
k ++;
st ++;
}
while (mij <= dr) {
v2[k] = v[mij];
v3[k] = m[mij];
k ++;
mij ++;
}
// se scriu elementele inapoi in vectorul initial, dar de aceasta data sortate
for (p = 0; p < elem; p ++) {
v[dr] = v2[dr];
m[dr] = v3[dr];
dr --;
}
}
}
int main() {
int h_max, nr_gutui, d_h;
int i, j, min, pus=0, nr_niv, ok=1, niv_max;
int *h, *masa, *prioritate, *temp1, *temp2;
int maxim, strans=0;
int marin, marir;
FILE *in, *out;
in=fopen("gutui.in","r");
out=fopen("gutui.out","w");
fscanf(in,"%d ", &nr_gutui);
fscanf(in,"%d ", &h_max);
fscanf(in,"%d", &d_h);
h=(int *)malloc(nr_gutui*sizeof(int));
masa=(int *)malloc(nr_gutui*sizeof(int));
prioritate=(int *)malloc(nr_gutui*sizeof(int));
temp1=(int *)malloc(nr_gutui*sizeof(int));
temp2=(int *)malloc(nr_gutui*sizeof(int));
for(i=0;i<nr_gutui;i++)
fscanf(in,"\n%d %d",&h[i], &masa[i]);
mergeSort(h,masa,temp1,temp2,0,nr_gutui-1);
min=h[nr_gutui-1];
nr_niv=(h_max-min)/d_h+1;
for(i=0;i<nr_gutui;i++)
prioritate[i]=(h[i]-1)/d_h+1;
niv_max=h_max/d_h;
for(i=0;i<nr_gutui;i++) {
if(pus==nr_niv) break;
if(h[i]+pus*d_h>h_max) continue;
marin=0;
marir=0;
for (j=i+1;j<nr_gutui;j++) {
if(prioritate[j]==prioritate[i]) {
if(masa[j]>masa[i]) {
marin++;
marir++;
}
}
else {
if(masa[j]>masa[i])
marir++;
}
}
if (marir<nr_niv-pus) {
if(prioritate[i]+pus+marin>niv_max)
continue;
else {
strans+=masa[i];
pus++;
}
}
//printf("%d - %d %d %d %d\n",h[i],marin,marir,pus, strans);
}
/* printf("\n");
for(i=0;i<nr_gutui;i++)
printf("%d %d %d\n",h[i], masa[i], prioritate[i]);
printf("min=%d \nnivele=%d\nstrans=%d\n",min,nr_niv, strans);*/
fprintf(out,"%d",strans);
fclose(in);
fclose(out);
system("pause");
return 0;
}