#include <stdio.h>
#include <malloc.h>
const char *fin="gutui.in";
const char *fout="gutui.out";
int N,H,U,GG;
// Functie pentru citire si validare numarului de gutui N
void readn()
{
FILE *f;
f=fopen(fin,"r");
fscanf(f,"%d %d %d",&N,&H,&U);
fclose(f);
}
// Functie pentru citirea din fisierul gutui.in a vectorilor inaltimilor si
// greutatilor
void readf(int *pg,int *ph)
{
FILE *f;
int i,j;
f=fopen(fin,"r");
fscanf(f,"%d %d %d",&N,&i,&j);
for(i=0;i<N;i++)
fscanf(f,"%d %d",ph+i,pg+i);
fclose(f);
}
// Functie pentru scrierea solutiei in fisierul gutui.out
void writef()
{
FILE *f;
f=fopen(fout,"wb");
fprintf(f,"%d",GG);
fclose(f);
}
// Functie de sortare
void sort(int p, int q, int *ph, int *pg){
int aux;
if(pg[p]<pg[q]){
aux=pg[p];
pg[p]=pg[q];
pg[q]=aux;
aux=ph[p];
ph[p]=ph[q];
ph[q]=aux;
}
}
//Functie de interclasare
void interc(int p, int q, int m, int *ph, int *pg){
int *b,i,j,k;
b=(int *)malloc(N*sizeof(int));
i=p;
j=m+1;
k=1;
while((i<=m) && (j<=q))
if(pg[i] >= pg[j]){
b[k]=pg[i];
i=i+1;
k=k+1;
}
else {
b[k]=pg[j];
j=j+1;
k=k+1;
}
if(i<=m)
for(j=i; j<=m; j++){
b[k]=pg[j];
k=k+1;
}
else
for(i=j; j<=q; j++){
b[k]=pg[i];
k=k+1;
}
k=1;
for(i=p; i<=q; i++){
pg[i]=b[k];
k=k+1;
}
}
// Functie de sortare ......................
void sortd(int p, int q, int *ph, int *pg){
int m;
if((q-p)<=1) sort(p,q,ph,pg);
else {
m=(p+q)/2;
sortd(p,m,ph,pg);
sortd(m+1,q,ph,pg);
interc(p,q,m,ph,pg);
}
}
// Initializare vector la adresa p cu 0
void init(int *p)
{
int i;
for(i=0;i<N;i++)
*(p+i)=0;
}
// Functie pentru constructia vectorului nivelelor
// gutuilor
void nivele(int *ph, int *nivel)
{
int i,j;
for(i=0;i<N;i++)
*(nivel+i)=(H+U-*(ph+i))/U;
//*(nivel+i)=(H-*(ph+i))/10+1;
for(i=0;i<N;i++)
{
j=0;
while(j<i)
{
if(*(nivel+i)==*(nivel+j))
{
*(nivel+i)-=1;
j=0;
}
else j++;
}}
}
// Functie pentru culegere gutui
int culeg(int *p, int *vmase)
{
int i,masa;
for(masa=0,i=0;i<N;i++)
if(*(p+i)>0)
masa+=*(vmase+i);
return masa;
}
// n = numar de gutui din copac
// H = inaltimea la care poate ajunge culegatorul
// U = inaltimea cu care se ridica crengile dupa culegerea unei gutui
// vg = pointer catre vectorul maselor gutuilor
// vh = pointer catre vectorul inaltimilor la care se afla initial gutuile
// GG = masa totala a gutuilor culese
int main()
{
//int N=4,H=100,U=10;
//int hg[4]={91,82,93,94}, mg[4]={10,30,5,15};
//int N=6,H=100,U=10;
//int hg[6]={71,72,73,82,91,92}, mg[6]={20,30,30,5,15,25};
//int N=9,H=100,U=10;
//int hg[9]={40,20,70,80,50,30,60,30,50}, mg[9]={2,1,1,3,1,2,3,2,2};
int *vh,*vg,*nivel;
readn();
vh=(int *)malloc(N*sizeof(int));
vg=(int *)malloc(N*sizeof(int));
nivel=(int *)malloc(N*sizeof(int));
readf(vg,vh);
sortd(0,N-1,vh,vg);
init(nivel);
nivele(vh,nivel);
GG=culeg(nivel,vg);
printf(" Masa totala este %d \n",GG);
writef();
return 0;
}