#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct gut
{
long int iteratie;
long int greutate;
} gutui;
int compare_desc (const void * a, const void * b)
{
gutui *g1 = (gutui *)a;
gutui *g2 = (gutui *)b;
return ( g2->greutate - g1->greutate );
}
int compare_cresc (const void * a, const void * b)
{
return ( *(long int*)a - *(long int*)b );
}
int iteratii(long int a,long int b)
{
ldiv_t result;
result = ldiv(a,b);
//if (result.rem==0) return result.quot+1;
return result.quot+1;
}
void inalta (gutui *a, long int n,long int iter)
{
long int i;
for (i=0;i<n;i++)
if (a[i].iteratie>=iter)
a[i].iteratie--;
}
void swap(gutui *x,gutui *y)
{
gutui aux;
aux = *x;
*x = *y;
*y = aux;
}
long int numar_apar(gutui *a,long int x,long int pi,long int n)
{
long int nr=0;
long int i=pi;
//int gasit=1;
while (i<n)
{
if (x!=a[i].iteratie)
break;
i++;
nr++;
}
return nr;
}
void copiere (gutui *s,gutui *d,long int pi,long int nr,long int *nd)
{
long int i;
for (i=pi;i<pi+nr;i++)
{
d[*nd]=s[i];
*nd=*nd+1;
}
}
void creare_aux (gutui *s,gutui *d,long int n,long int *naux)
{
long int i=0;
long int nr;
while (i<n)
{
nr=numar_apar(s,s[i].iteratie,i,n);
if (nr<=s[i].iteratie)
{
copiere(s,d,i,nr,naux);
}
else
{
copiere(s,d,i,s[i].iteratie,naux);
}
i=i+nr;
}
}
int main()
{
FILE *f=fopen ("gutui.in","r");
FILE *g=fopen ("gutui.out","w");
gutui *a,*aux;
long int n,h,u,i,inaltime,greutate,nr=0;
fscanf(f,"%ld %ld %ld",&n,&h,&u);
a=(gutui*)malloc(n*sizeof(gutui));
aux=(gutui*)malloc(n*sizeof(gutui));
long int naux=0;
long int gmax;
for (i=0;i<n;i++)
{
fscanf(f,"%ld %ld",&inaltime,&greutate);
if (inaltime<=h)
{
a[nr].greutate=greutate;
a[nr].iteratie=iteratii(h-inaltime,u);
nr++;
}
}
n=nr;
qsort(a,n,sizeof(gutui),compare_cresc);
/*for (i=0;i<n;i++)
printf("+%ld %ld\n",a[i].iteratie,a[i].greutate);*/
int sortat=1;
while (sortat)
{
sortat=0;
for (i=0;i<n-1;i++)
if ((a[i].iteratie==a[i+1].iteratie)&&(a[i].greutate<a[i+1].greutate))
{
swap(&a[i],&a[i+1]);
sortat=1;
}
}
creare_aux (a,aux,n,&naux);
qsort(aux,naux,sizeof(gutui),compare_desc);
gmax=0;
for (i=0;i<naux;i++)
{
if (aux[i].iteratie>0)
{
gmax=gmax+aux[i].greutate;
inalta(aux,naux,aux[i].iteratie);
}
}
fprintf (g,"%ld\n",gmax);
free(aux);
free(a);
fclose(f);
fclose(g);
return 0;
}