#include<stdio.h>
#include<stdlib.h>
typedef struct gut{
int h,w;
}Gutuie;
int max(int ** mat,int *v, int m, int n )
{
int i, max ,p,j;
/*
for(i = 0; i < n; i++)
printf(" %d ",v[i]);
printf("\n");
*/
max = v[0];
p = 0;
for(i = 1; i < n; i++){
if(v[i] > max){
max = v[i];
p = i;
}
}
if(max != 0){
for(j = 0; j < m; j++)
mat[j][p] = 0;
}
//printf("p este %d si max este %d \n",p,max);
return max;
}
void read(Gutuie **g, int *n, int *H, int *U, char *file)
{
FILE *f;
int i = 0,hh,gg;
f = fopen(file, "r");
fscanf(f,"%d %d %d ",n,H,U);
(*g) = (Gutuie *)malloc((*n)*sizeof(Gutuie));
*n = 0;
while(fscanf(f,"%d %d ",&hh,&gg) > 0 ){
if(hh <= *H){
(*g)[i].h = hh;
(*g)[i].w = gg;
i++;
(*n) = (*n) + 1;
}
}
/*
for(i = 0; i < *n;i++){
printf("gutuia %d are h de %d i cantareste %d \n",i,(*g)[i].h,(*g)[i].w);
}
*/
}
int nrGutui(Gutuie *g, int n, int H, int U)
{
int m, **mat, i, j, p, nr = 0;
if(H % U == 0)
m = H / U ;
else
m = H / U + 1;
mat = (int **)malloc(m * sizeof(int *));
for(i = 0; i < m; i++ )
mat[i] = (int *)malloc(n * sizeof(int));
for(i = 0; i < n; i++){
if(g[i].h % U == 0)
p = (g[i].h) / U - 1;
else
p = (g[i].h) / U;
// printf("%d\n",p);
for(j = p; j < m; j++){
mat[j][i] = g[i].w;
// printf("i este %d p este %d G este %d \n",i,j,mat[j][i]);
}
}
for(i = 0; i < m; i++){
for(j = 0; j < n; j++ )
printf("%d ",mat[i][j]);
printf("\n");
}
for(i = 0; i < m; i++)
nr = nr + max(mat,mat[i],m,n);
return nr;
}
int main()
{ int n,H,U,nr;
FILE *f;
Gutuie *g;
read(&g,&n,&H,&U,"gutui.in");
nr = nrGutui(g,n,H,U);
f = fopen("gutui.out","w");
fprintf(f,"%d",nr);
fclose(f);
return 0;
}