//#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
//int max[];
int N=0, H=0, U=1, nr=0, i, ii, j, k=0, aux=0, r, t, a=0, b=0, suma=0, **max, *diag, *ord;
FILE *f, *g;
int compare_int (const void *Y, const void *Z)
{
int y = *((int *)Y);
int z = *((int *)Z);
if (y > z)
{
return -1;
}
else
{
if (y < z)
{
return 1;
}
else
{
return 0;
}
}
}
int main()
{
f = fopen("gutui.in","r");
if(!f) {printf("eroare f"); return 1;}
g = fopen("gutui.out","w");
if(!f) {printf("eroare g"); return 2;}
fscanf(f,"%i", &N);
fscanf(f,"%i", &H);
fscanf(f,"%i", &U);
nr = H/U;
max = calloc ((nr+2),sizeof(int*));
ord = calloc ((nr+2),sizeof(int*));
for(i=0;i<=nr+1;i++) { max[i] = calloc (N+nr+1,sizeof(int));
}
for(i=0;i<=nr+1;i++)
for(j=0;j<=N+nr; j++) max[i][j]=0;
for(i=0;i<N;i++)
{
// printf("\n nivelul %i : %i ", j, max[j][0]);
fscanf(f,"%i", &a); //a este inaltime initiala
fscanf(f,"%i", &b); //b este greutatea
if(a<=H)
{
j= nr - a/U; //j indica ordinea de evaluare
// max[j] = calloc ((nr+1),sizeof(int));
ord[j]++; r=ord[j]; printf("\nr=%i ", r);
// for(k=1;k<r;k++)
// if(b>max[j][k]) { aux=b; b=max[j][k]; max[j][k]=aux; }
max[j][r]=b;
// printf("\n%i %i", max[j][r], max[j][r-1]);
//max[j][max[j][0]] = b;
//if(b > max[j-1]) max[j-1] = b;
// printf("\n nivelul %i : %i ", j, ord[j]); //sleep(1);
}
}
for(i=1;i<=nr;i++) qsort((void *)(max[i]), N, sizeof(int), compare_int);
//for(i=1;i<=nr;i++)
diag = calloc (N+nr+1,sizeof(int));
for(i=0;i<=N+nr;i++) diag[i]=0;
k=0;
for(i=1;i<=nr;i++)
{ for(j=0;j<=i-1;j++) //{ diag[k]=max[i][j]; k++;} printf(" %i ", diag[k]);
{
// printf(" %i ", max[i][j]);
if(max[i][j]>0) { diag[k]=max[i][j]; k++; }
}
printf("\n");
}
qsort((void *)diag, N+2, sizeof(int), compare_int);
for(j=0;j<=nr;j++) printf("%i ",diag[j]);
for(j=0;j<=N;j++) suma+=diag[j];
fprintf(g,"%i", suma);
// printf("\n%i ", suma);
free (max);
fclose(f);
fclose(g);
//getch();
return 0;
}