#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef struct{
int h, g, niv;
}gutui;
bool comparator(gutui g1,gutui g2){
return g1.niv<g2.niv;
}
void quicksort(gutui *data, int N)
{
int i, j, v;
int tmp1,tmp2,tmp3;
if( N <= 1 )
return;
// Partition elements
v = data[0].niv;
i = 0;
j = N;
for(;;)
{
while(data[++i].niv < v && i < N) { }
while(data[--j].niv > v) { }
if( i >= j )
break;
tmp1=data[i].niv;
data[i].niv=data[j].niv;
data[j].niv=tmp1;
tmp2=data[i].h;
data[i].h=data[j].h;
data[j].h=tmp2;
tmp3=data[i].g;
data[i].g=data[j].g;
data[j].g=tmp3;
}
tmp1=data[i-1].niv;
data[i-1].niv=data[0].niv;
data[0].niv=tmp1;
tmp2=data[i-1].h;
data[i-1].h=data[0].h;
data[0].h=tmp2;
tmp3=data[i-1].g;
data[i-1].g=data[0].g;
data[0].g=tmp3;
quicksort(data, i-1);
quicksort(data+i, N-i);
}
void quickSort1(gutui *vect, int stanga, int dreapta) {
int i = stanga, j = dreapta;
int tmp1, tmp2, tmp3;
int pivot = vect[dreapta].niv;
while (i <= j){
while (vect[i].niv < pivot)
i++;
while (vect[j].niv > pivot)
j--;
if (i <= j){
tmp1=vect[i].niv;
vect[i].niv=vect[j].niv;
vect[j].niv=tmp1;
tmp2=vect[i].h;
vect[i].h=vect[j].h;
vect[j].h=tmp2;
tmp3=vect[i].g;
vect[i].g=vect[j].g;
vect[j].g=tmp3;
i++;
j--;
}
}
if (stanga < j)
quickSort1(vect, stanga, j);
if (i < dreapta)
quickSort1(vect, i, dreapta);
}
int main(){
int n, h, u, i, j, k, *a, suma=0, t, dim=0, min;
gutui *gut;
//citire
FILE *fo, *fc;
fo=fopen("gutui.in", "r");
fscanf(fo,"%d%d%d", &n, &h, &u);
gut=(gutui*)malloc(n*sizeof(gutui));
a=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++){
fscanf(fo,"%d%d", &gut[i].h, &gut[i].g);
gut[i].niv=(h-gut[i].h)/u+1;
if(gut[i].h>h || gut[i].h<0)
gut[i].niv=0;
}
fclose(fo);
//sortare dupa nivelul fata de h maxim
//quickSort1(gut,0,n-1);
//quicksort(gut,n);
sort(gut,gut+n,comparator);
for(i=0;i<n;i++)
printf("%d\t", gut[i].g);
printf("\n");
for(i=0;i<n;i++)
printf("%d\t", gut[i].h);
printf("\n");
for(i=0;i<n;i++)
printf("%d\t", gut[i].niv);
printf("\n");
printf("\n");
//creare vector cu elemnte maxime (care cor reprezenta greutatea finala)
dim=0;
t=0;
k=0;
for(i=0;i<n;i++){
if(dim<gut[i].niv){
a[dim]=gut[i].g;
dim++;
}
else{
min=a[0];
for(j=0;j<dim;j++)
if(min>a[j]){
min=a[j];
t=j;
}
if(min<gut[i].g)
a[t]=gut[i].g;
}
}
for(i=0;i<dim;i++)
printf("%d ", a[i]);
printf("\n");
//calcul suma
for(i=0;i<dim;i++)
suma=suma+a[i];
printf("%d\n",suma);
//scriere in fisier
fc=fopen("gutui.out", "w");
fprintf(fc,"%d\n",suma);
fclose(fc);
//eliberare memorie
free(gut);
free(a);
return 0;
}