#include <stdio.h>
#include <stdlib.h>
#include <time.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 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;
}
}
long int suma(gutui *a,long int pi,long int n, long int ne)
{
long int i,s=0,k=0;
for (i=pi;((i<n)&&(k<ne));i++)
if (a[i].iteratie>k)
{
s=s+a[i].greutate;
k++;
}
return s;
}
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,j,k;
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;
long int nr=0;
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);
creare_aux (a,aux,n,&naux);
long int imax=aux[naux-1].iteratie;
long int max=0;
for (k=0;k<naux;k=k+numar_apar(aux,aux[k].iteratie,k,naux))
{
i=k;
j=0;
gmax=0;
while ((i<naux-1)&&(j<=imax))
{
if ((aux[i].iteratie>j)&& ((suma (aux,i,naux,imax-j-1)>=suma(aux,i+1,naux,imax-j-1))||(aux[i].iteratie>j+1)))
{
gmax=gmax+aux[i].greutate;
i++;
j++;
}
else
{
i=i+numar_apar(aux,aux[i].iteratie,i,naux);
}
}
if (j<imax)
{
gmax=gmax+aux[naux-1].greutate;
}
if (gmax>max)
max=gmax;
}
fprintf (g,"%ld\n",max);
free(aux);
free(a);
fclose(f);
fclose(g);
return 0;
}