/*
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *input;
FILE *output;
int i,j,m,n;
//matricea,si culorile
char* temp;
char *p1;
int *p2;
char c;
char **matrice;
int **numar;
int *temp2;
int dimens;
int nr_1;
int max;
int nr;
int nr_old;
int changed;
input = fopen("figuri2.in","r");
max =1;
nr = 0;
nr_1=0;
//citesc datele
if(input == NULL)
{
printf("Error: can't open file.\n");
}
else
{
printf("File opened. Reading ...\n");
fscanf(input,"%d",&dimens);
printf("dim : %d", dimens);
temp = (char*)calloc((dimens)*(dimens),sizeof(char));
matrice = (char**)calloc(dimens, sizeof(char*));
for(i=0;i<dimens;i++)
matrice[i] = &temp[i*dimens];//temp[i*(dimens)];
for(i=0;i<dimens;i++)
for(j=0;j<dimens;j++){
fscanf(input,"%1d",&n);
matrice[i][j]=(char)n;
nr_1+=n;
}
//matrice = (char**)calloc(dimens,char*
fclose(input);
}
//am citit datele
for(i=0;i<dimens;i++){
printf("\n");
for(j=0;j<dimens;j++)
printf("%d",matrice[i][j]);
}
p1= &matrice[0][0];
temp2 = (int*)calloc((dimens)*(dimens),sizeof(int));
numar = (int**)calloc(dimens, sizeof(int*));
for(i=0;i<dimens;i++)
numar[i] = &temp2[i*dimens];//temp[i*(dimens)];
p2= &numar[0][0];
nr = nr_1;
for(i=0;i<dimens;i++)
for(j=0;j<dimens;j++, p1++,p2++){
if( *p1 == 0)
*p2==0;
else{
if(i==0 || j==0 )
(*p2) = (int)(*p1);
else{
if(*(p2-dimens-1)==0)
(*p2) = (int)(*p1);
else{
(*p2) = 1;
for(m=1;m<=*(p2-dimens-1);m++){
if(*(p1-m) == 1 && *(p1 - dimens*m)==1)
(*p2)+=1;
else
m=1000;
}
if(*p2 == max)
nr+=1;
if(*p2> max){
max = *p2;
nr = 1;
}
}
}
}
}
p2= &numar[0][0];
output=fopen("figuri2.out","w");
fprintf(output,"%d %d\n\r",max,nr);
printf("\n %d %d",max,nr);
printf("\n");
for(i=0;i<dimens;i++){
printf("\n");
for(j=0;j<dimens;j++, p2++)
printf("%d",*p2);
}
p1= &matrice[0][0];
//p2= &numar[0][0];
max =1;
nr =0;
changed = 1;
while(changed == 1){
changed = 0;
nr_old=nr;
nr=0;
p1= &matrice[0][0];
for(i=0;i<dimens;i++)
for(j=0;j<dimens;j++, p1++){
if(i!=0 && j!=0){
if(*(p1-1) >= max && *(p1+1) >= max && *(p1-dimens) >= max && *(p1+dimens) >= max)
{
*p1=max+1;
nr+=1;
changed = 1;
}
}
}
max+=1;
}
printf("\n %d %d",max-1,nr_old);
//scriu in fisierul de iesire
//output=fopen("figuri2.out","w");
fprintf(output,"%d %d\n",max-1,nr_old);
fclose(output);
fclose(output);
c=(char)0;
//getchar();
return 0;
}
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DEBUG 0
typedef struct gutuie{
int greut;
int inalt;
int rez;
}gutuie;
struct node
{
int priority;
int info;
struct node *next;
}*start,*q,*temp,*noul;
typedef struct node *N;
void insert(int itprio)
{
//int item,itprio;
noul=(struct node *)calloc(1,sizeof(struct node));
noul->priority=itprio;
if(start==NULL || itprio<start->priority)
{
noul->next=start;
start=noul;
}
else
{
q=start;
while(q->next != NULL && q->next->priority<=itprio)
q=q->next;
(noul->next)=(q->next);
q->next=noul;
}
}
int peek()
{
if(start==NULL)
return 0;
else
return start->priority;
}
void del()
{
if(start==NULL)
{
printf("\nQUEUE UNDERFLOW\n");
}
else
{
noul = start;
//printf("\nDELETED ITEM IS %d\n",new->info);
start=start->next;
free(noul);
}
}
void display()
{
int max =15;
temp=start;
if(start==NULL)
printf("QUEUE IS EMPTY\n");
else
{
printf("QUEUE IS:\n");
while(temp!=NULL && max-- > 0)
{
printf(" [priority=%d]",temp->priority);
temp=temp->next;
}
}
}
void swap (gutuie *a, gutuie *b)
{
gutuie c = *a;
*a = *b;
*b = c;
}
void qsort_r (gutuie* primul, gutuie* ultimul)
{
gutuie *mic = primul;
gutuie *mare = ultimul;
gutuie pivot = *(primul+(ultimul-primul)/2);
while (mic <= mare)
{
while ((*mic).rez < pivot.rez || ((*mic).rez == pivot.rez && (*mic).greut > pivot.greut) ) mic++;
while (pivot.rez < (*mare).rez || (pivot.rez == (*mare).rez && pivot.greut > (*mare).greut)) mare--;
if (mic < mare) swap (mic++, mare--);
else mic++;
}
if (primul < mare)
qsort_r (primul, mare);
if (mare < ultimul)
qsort_r (mare+1, ultimul);
}
int main()
{
FILE *input;
FILE *output;
int i,j,m,n;
int Nr,H,U;
int *inaltimi;
int *greutati;
int *rezista;
gutuie *vec;
int rezultat=0;
int remains;
int alese;
int nr_gutui;
int diferenta,nivel,niv_curent,alesi_pe_nivel;
input = fopen("gutui.in","r");
fscanf(input,"%d %d %d",&Nr,&H,&U);
inaltimi = (int*)calloc(Nr,sizeof(int));
greutati = (int*)calloc(Nr,sizeof(int));
rezista = (int*)calloc(Nr,sizeof(int));
vec = (gutuie*)calloc(Nr,sizeof(gutuie));
start = NULL;
for(i=0;i<Nr;i++){
fscanf(input,"%d %d",&(vec[i].inalt),&(vec[i].greut));
}
fclose(input);
for(i=0;i<Nr;i++)
vec[i].rez = (H-vec[i].inalt)/U+1;
qsort_r(vec,vec+Nr-1);
if(DEBUG)
for(i=0;i<Nr;i++)
printf("%d %d %d\n", vec[i].greut,vec[i].rez,vec[i].inalt);
remains = 0;
nivel = vec[0].rez;
niv_curent = nivel;
if(DEBUG)printf("incep");
//inserez primele
alesi_pe_nivel=0;
for(i=0;i<nivel&&vec[i].rez==nivel;i++){
alesi_pe_nivel+=1;
insert(vec[i].greut);
}
diferenta =0;
alese=alesi_pe_nivel;
//alesi_pealesi_pe_nivel_nivel = nivel;
for(i=alesi_pe_nivel;i<Nr;i++){
if(DEBUG)display();
if(DEBUG)printf("\n-%d- %d %d\n",i,vec[i].greut,vec[i].rez);
if(vec[i].rez > nivel){
if(DEBUG)printf("schimb\n");
niv_curent = vec[i].rez;
diferenta = niv_curent - alese;
nivel=niv_curent;
//aleg diferenta
insert(vec[i].greut);
alese+=1;
diferenta -=1;
alesi_pe_nivel =1;
}else
{
if(diferenta>0){
if(DEBUG)printf("dif ok\n");
insert(vec[i].greut);
alese+=1;
diferenta -=1;
alesi_pe_nivel+=1;
}
else
{ if(DEBUG)printf("inc swap\n");
if(alesi_pe_nivel < niv_curent){
if(DEBUG)printf("URA");
if(peek() < vec[i].greut){
del();
insert(vec[i].greut);
alesi_pe_nivel+=1;
}
}
}
}
}
diferenta =0;
while(start != NULL)
{
diferenta += peek();
del();
}
/*
for(i=Nr-1;i>=0;i--)
if(vec[i].rez - remains > 0){
rezultat += vec[i].greut;
remains+=1;
printf("aleg: %d %d\n",vec[i].greut,vec[i].rez);
}
*/
output=fopen("gutui.out","w");
fprintf(output,"%d",diferenta);
fclose(output);
//getchar();
return 0;
}