//UNGUREANU CRISTIAN 324CA
//TEMA 1 PA - GUTUI
#include <stdio.h>
// nr gutui, inaltimea maxima, inaltarea, rezultatul final
long n, hi, u, smax;
// inantimea fiecarei gutui si greutatea
long h[100001], w[100001], i, j, aux, nrs, found, k;
long hmin, h1[100001], w1[100001], imax, max, level[100001], lmin;
void rise()
{
for(i=0; i<n; i++)
h[i]+=u;
}
void update()
{
// nu are sens sa pastram in vectorii h si w valorile pentru fructele care nu mai pot fi accesate (sunt prea sus)
j=0;
for(i=0; i<n; i++)
if(h[i]<=hi)
{
h1[j]=h[i];
w1[j]=w[i];
j++;
}
n=j;
for(i=0; i<n; i++)
{
h[i]=h1[i];
w[i]=w1[i];
}
}
//functii pentru quicksort
void swap(long *x, long *y)
{
long auxi;
auxi = *x;
*x = *y;
*y = auxi;
}
long pivot(long i, long j)
{
return((i+j)/2);
}
void quicksort(long m, long n)
{
long i, j, k, l;
if( m < n)
{
k = pivot(m, n);
swap(&h[m], &h[k]);
swap(&w[m], &w[k]);
l = w[m];
i = m+1;
j = n;
while(i <= j)
{
while((i <= n) && (w[i] >= l))
i++;
while((j >= m) && (w[j] < l))
j--;
if( i < j)
{
swap(&h[i], &h[j]);
swap(&w[i], &w[j]);
}
}
swap(&h[m], &h[j]);
swap(&w[m], &w[j]);
quicksort( m, j-1);
quicksort( j+1, n);
}
}
int main()
{
FILE *f=fopen("gutui.in", "r");
FILE *g=fopen("gutui.out", "w");
fscanf(f, "%ld %ld %ld", &n, &hi, &u);
for(i=0; i<n; i++)
fscanf(f, "%ld %ld", &h[i], &w[i]);
//sortam descrescator fructele, in functie de greutate
quicksort(0, n-1);
smax=0;
// la inceput sa elimin valorile prea inalte
update();
while(n>0)
{
hmin=hi;
for(i=0; i<n; i++)
{
if(h[i]<hmin)
hmin=h[i];
level[i]=(hi-h[i])/u;
}
nrs=(hi-hmin)/u+1;
lmin=nrs-1; // niveul minim
for(i=0; i<nrs; i++) // fiindca primele fructele sunt cele mai grele
if(level[i]<lmin)
lmin=level[i];
max=0, imax=-1;
for(i=0; i<nrs; i++) // din fructele grele care se afla pe nivelul minim, il alegem pe cel mai greu
if(level[i]==lmin && w[i]>max)
{
imax=i;
max=w[i];
}
smax+=max;
for(i=imax+1; i<n; i++) // stergem fructul din vectorii inaltime si greutate
{
h[i-1]=h[i];
w[i-1]=w[i];
}
n--;
rise(); // toate fructele ramase se inalta
update(); // nu ne mai intereseaza fructele inaccesibile
}
printf("%ld\n", smax);
fprintf(g, "%ld", smax);
fclose(f);
fclose(g);
return 0;
}