#include <stdio.h>
#include <stdlib.h>
unsigned int h,u,n;
struct gut{
unsigned int inalt;
unsigned int greu;
};
int compare (const void * a, const void * b)
{
unsigned int cat1, cat2;
cat1 = ((*(struct gut*)a).inalt/u);
cat2 = ((*(struct gut*)b).inalt/u);
if (cat1 == cat2)
return -((*(struct gut*)a).greu - (*(struct gut*)b).greu);
return -(cat1 - cat2);
}
int main(){
unsigned int i, j, k;
FILE *f = fopen("gutui.in","r");
fscanf(f, "%u", &n);
fscanf(f, "%u", &h);
fscanf(f, "%u", &u);
//printf("n = %u h = %u u = %u\n", n ,h,u);
//printf("%u\n", h/u);
struct gut *gutui = (struct gut *)malloc(n * sizeof(struct gut));
for (i = 0; i < n; i++)
{
fscanf(f, "%u", &gutui[i].inalt);
fscanf(f, "%u", &gutui[i].greu);
}
fclose(f);
qsort(gutui, n, sizeof(struct gut), compare);
/*for (i = 0; i < n; i++)
{
printf("%u ", gutui[i].greu);
printf("%u \n", gutui[i].inalt);
}
printf("\n");*/
unsigned int nr_niv = (h - gutui[n - 1].inalt)/u + 1;
unsigned int *niv = (unsigned int *)calloc(nr_niv ,sizeof(unsigned int));
unsigned int *nrgutpeniv = (unsigned int *) calloc(nr_niv, sizeof(unsigned int));
unsigned int *indpeniv = (unsigned int *) calloc(nr_niv, sizeof(unsigned int));
//printf("nr_niv = %u\n", nr_niv);
j = 0;
for ( i = 0; i < nr_niv; i++)
{
k = 0;
if (j < n){
if (((h - gutui[j].inalt)/u ) == i)
{
indpeniv[i] = j + 1;
niv[i] = i + 1;
k = k + 1;
j = j + 1;
}
}
if (j < n)
while (((h - gutui[j].inalt)/u ) == i)
{
k = k + 1;
j = j + 1;
}
nrgutpeniv[i] = k;
}
/*printf("indici pe niv: \n");
for ( i = 0; i < nr_niv; i++)
printf("%u ", indpeniv[i]);
printf("\n");
printf("gutui pe niv: \n");
for ( i = 0; i < nr_niv; i++)
printf("%u ", nrgutpeniv[i]);
printf("\n");
printf("niv: \n");
for ( i = 0; i < nr_niv; i++)
printf("%u ", niv[i]);
printf("\n");*/
i = 0;
unsigned int index = 0, max = 0, fin = 0, niv_vir = 0, kk;
for (i = 0; i < nr_niv; i++){
//printf("i = %u\n", i);
max = 0;
niv_vir = 0;
for (j = 0; j < nr_niv; j++){
if (indpeniv[j] != 0){
//printf("j = %u\n", j);
//if (niv[j] <= (nrgutpeniv[j]))
if (niv[j] != 0){
//if ((gutui[indpeniv[j] - 1].inalt + i * u )<= h)
if ((niv_vir + 1) <= nrgutpeniv[j])
{
//printf("nrgutpeniv = %u \n", nrgutpeniv[j]);
//printf("!!!!!!!!%u\n",indpeniv[j] - 1 + niv[j] - 1);
//if (max < (gutui[indpeniv[j] - 1 + niv[j] - 1].greu))
if (max < (gutui[indpeniv[j] - 1 + niv_vir].greu))
{
//kk = gutui[indpeniv[j] - 1 + niv_vir].greu;
//printf("kk = %u ",kk);
//if (max < kk) printf("!!!!!\n");
//printf("max = %u\n", max);
//printf("j = %u niv_vir = %u ", j, niv_vir);
//printf("!\n");
//max = gutui[indpeniv[j] - 1 + niv[j] - 1].greu;
max = gutui[indpeniv[j] -1 + niv_vir].greu;
//printf("max = %u\n", max);
index = j;
}
}
niv_vir++;
}
//break;
}
}
//printf("max = %u\n", max);
if (max == 0) {
for (j = 0; j < nr_niv; j++)
if (indpeniv[j] != 0){
//printf("j = %u\n", j);
if ((niv[j] != 0)&&(nrgutpeniv[j] != 0)){
//printf("!!!!!!!!%u\n",indpeniv[j] - 1 + niv[j] - 1);
if (max < (gutui[indpeniv[j] - 1].greu))
{
//printf("!\n");
max = gutui[indpeniv[j] - 1].greu;
index = j;
}
}
}}
else
max = gutui[indpeniv[index] - 1].greu;
//printf("index = %u\n", index);
//printf("max = %u\n", max);
if (nrgutpeniv[index] != 0) nrgutpeniv[index] = nrgutpeniv[index] - 1;
if (nrgutpeniv[index] != 0) indpeniv[index] = indpeniv[index] + 1;
fin = fin + max;
/*printf("indici pe niv: \n");
for ( j = 0; j < nr_niv; j++)
printf("%u ", indpeniv[j]);
printf("\n");
printf("gutui pe niv: \n");
for ( j = 0; j < nr_niv; j++)
printf("%u ", nrgutpeniv[j]);
printf("\n");*/
for (j = 0; j < nr_niv; j++)
if (niv[j] != 0) niv[j] = niv[j] - 1;
/*printf("niv: \n");
for ( j = 0; j < nr_niv;j++)
printf("%u ", niv[j]);
printf("\n");*/
}
f = fopen("gutui.out", "w");
fprintf(f, "%u\n", fin);
//printf("fin = %u\n", fin);
fclose(f);
return 0;
}