//s=vectorul unde bag gutuile pe care le culeg
//H-inaltimea maxima la care ajunge Gigel
//U-cu cat se ridica crengile
//g-greutate fruct
//h-inaltime fruct
//G-greutate maxima
//N-nr gutui
#include<stdio.h>
#include<stdlib.h>
typedef struct gut
{
unsigned int nivel;
unsigned int g;
}gutuie;
//gutuile de la inaltime mare le iau primele ,sortez descr
//profit=greutate, job=gutuie
int compare(const void*x,const void* y)
{
if((*(gutuie*)x).nivel == (*(gutuie*)y).nivel)
return ( (*(gutuie*)x).g - (*(gutuie*)y).g ) ;
else
return -((*(gutuie*)x).nivel-(*(gutuie*)y).nivel);
}
void coboara(unsigned int*,unsigned int, unsigned int);
void sterge(unsigned int *s, unsigned int *dim) {
s[0] = s[--(*dim)];
coboara (s,0,*dim);
}
//functie care schimba radacina si o coboara
void coboara(unsigned int *s,unsigned int i,unsigned int dim) //i va fi mereu 0 k bag in varf , dim=dimensiune
{
if (dim==1) return;
unsigned int stg = 2*i+1;
unsigned int dr = 2*i+2;
unsigned int min;
if(stg <dim && s[stg]<s[i])
min=stg;
else
min=i;
if(dr < dim && s[dr]<s[min])
min=dr;
unsigned int aux = s[i];
s[i] = s[min];
s[min] = aux;
if (i == min)
return;
else
coboara(s,min,dim);
}
void ridica (unsigned int *s, int poz,unsigned int dim) {
int parinte = (poz-1)/2;
unsigned int aux;
if (s[parinte]>s[poz]) {
aux = s[parinte];
s[parinte] = s[poz];
s[poz] = aux;
ridica(s,parinte,dim);
}
}
//functie care insereaza pe ultimul loc si ridica elementul
void insereaza(unsigned int *s,unsigned int *dim, unsigned int x)
{
int poz = *dim;
s[poz] = x;
(*dim)++;
ridica(s,poz,(*dim));
}
void afisare_heap(unsigned int *s, int dim) {
int i=0;
printf(">>>");
for (i=0;i<dim;i++)
printf("%d ", s[i]);
printf("\n");
}
int main()
{
FILE *f,*g;
f=fopen("gutui.in","r");
g=fopen("gutui.out","w");
unsigned int N;
unsigned int H;
unsigned int U;
//unsigned int h;
unsigned int s[100000]; //heap
//unsigned int G;
unsigned int i;
//unsigned int index=0;
unsigned int dim_heap;
unsigned int sum=0;
gutuie x[100000];
fscanf(f,"%u",&N);
fscanf(f,"%u",&H);
fscanf(f,"%u",&U);
//s=(unsigned int*)calloc(N,sizeof(unsigned int))
dim_heap=0;
//x=(gutuie*)malloc(N*sizeof(gutuie));
for(i=0;i<N;i++)
{
fscanf(f,"%u",&(x[i].nivel));
fscanf(f,"%u",&(x[i].g));
//x[i].nivel=1+(H-x[i].nivel)/U; //?
}
/*for (i=0;i<N;++i) {
printf("%u %u\n", x[i].nivel, x[i].g);
}
printf("\n");*/
//sortez descrescator dupa inaltime
qsort(x, N, sizeof(gutuie), compare);
/*for (i=0;i<N;++i) {
printf("%u %u\n", x[i].nivel, x[i].g);
}
printf("\n");*/
//parcurg vectorul de struct ,vad pe ce nivel sunt de fiec data( dim max=N a heap va fi nivelul pe care sunt) si bag greutatile in heap
/*
for(i=0;i<N;i++)
if(index<x[i].nivel)
ins_ult(s,
index++
else
inser
*/
//unsigned int nivel = 0,curr_nivel;
for (i=0; i<N;++i) if (x[i].nivel <= H) {
insereaza(s,&dim_heap,x[i].g);
break;}
H-=U;
for (i++;i<N;++i) {
if (x[i].nivel > H && x[i].g > s[0]) {
sterge(s,&dim_heap);
insereaza(s,&dim_heap,x[i].g);
//afisare_heap(s,dim_heap);
}
if (x[i].nivel <= H) {
insereaza(s,&dim_heap,x[i].g);
//afisare_heap(s,dim_heap);
H-=U;
}
}
for (i=0;i<dim_heap;++i) {
sum+=s[i];
}
fprintf(g,"%u\n",sum);
fclose(f);
fclose(g);
return 0;
}