#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//#define MAXX 4294967295UL
#define UINT_MAX 4294967295U
#define MAXX 1000000
//#define INT32_MAX 0x7fffffffL
//#define UINT32_MAX (__CONCAT(INT32_MAX, U) * 2UL + 1UL)
//#define UINT32_C(c) c ## UL
//#define MAXX 0x7fffffffL
typedef struct DATE {
unsigned long int a;
unsigned long int b;
} date;
date in[MAXX];
date out[MAXX];
void merge(int low, int high, int mid) {
int i, j, k;
unsigned long int c[MAXX],d[MAXX];
i=low;
j=mid+1;
k=low;
while((i<=mid)&&(j<=high)) { // sortez dupa in.a
//if(a[i]<a[j])
if (in[i].a > in[j].a) {
c[k]=in[i].a;
d[k]=in[i].b;
k++;
i++;
}
else {
c[k]=in[j].a;
d[k]=in[j].b;
k++;
j++;
}
}
while(i <= mid) {
c[k]=in[i].a;
d[k]=in[i].b;
k++;
i++;
}
while(j<=high){
c[k]=in[j].a;
d[k]=in[j].b;
k++;
j++;
}
for(i=low;i<k;i++) {
in[i].a=c[i];
in[i].b=d[i];
}
}
void mergesort( int low, int high) {
int mid;
if(low<high) {
mid=(low+high)/2;
mergesort(low,mid);
mergesort(mid+1,high);
merge(low,high,mid);
}
}
int main () {
FILE *f,*g;
f=fopen("gutui.in","r");
g=fopen("gutui.out","w");
//unsigned long
unsigned long int n,h,u; // n:numar de gutui h: inamtimea max u:cu cat se ridica crengile
unsigned long int min;
fscanf (f, "%lu %lu %lu",&n,&h,&u);
char c[100];
fgets(c,MAXX,f); // sa ajung pe urm linie
int i,j;
unsigned long int gmax=0; // greutatea maxima
for (i=0;i<n;i++) {
fscanf (f, "%lu %lu",&in[i].a,&in[i].b);
fgets(c,MAXX,f);// \n
}
/*printf ("\n hi \n"); // print la citire
for (i=0;i<n;i++)
printf ("%lu ",in[i].a);
printf ("\n ui \n");
for (i=0;i<n;i++)
printf ("%lu ",in[i].b);
*/
//sortare
mergesort(0,n-1);
printf ("\n sortat hi \n");
for (i=0;i<n;i++)
printf ("%lu ",in[i].a);
printf ("\n sortat ui \n");
for (i=0;i<n;i++)
printf ("%lu ",in[i].b);
//deci asadar si prin urmare
//acum iau fiecare elem din hi vad daca pot sa il adaug la structura
//daca pot il adaug : daca nu pot vad ce element as putea inlocui ai structura sa fie optima
int k = 0; //contor pt a numara cate elem voi avea in out
for (i = 0; i < n;i ++ )
if (in[i].a <= h) {
printf ("intru in primul if cu h %lu %lu \n",in[i].a,in[i].b);
out[k].a = in[i].a;
out[k].b = in[i].b;
gmax += in[i].b; //adaug la greutate
if (h < u)
h=0;
else
h -= u ; //scad inaltimea
printf ("h ramas %lu \n",h);
printf ("gmax %lu \n", gmax);
k++; //cre sc nr de elem
}
else {
min=out[0].b;
int pozmin=0;
printf ("********************************************\n");
for (j=1;j<k;j++) {
if (out[j].b < min ) {
min=out[j].b;
pozmin=j;
}
}
printf ( "minim############ %lu unde i= %d \n",min,i);
printf ("ce vreau sa inlocuiesc ***** %lu %lu\n", in[i].a,in[i].b);
printf ("INAINTE ***** %lu %lu\n", out[pozmin].a,out[pozmin].b);
if (k !=0)
if ( in[i].b > min ) {
printf ("gmax inainte %lu\n",gmax);
printf ( "ceea ce pun il loc %lu ce voi substitui %lu \n" , in[i].b , out[pozmin].b);
gmax =gmax + in[i].b - out[pozmin].b;
printf ("gmax dupa %lu\n",gmax);
out[pozmin].a = in[i].a;
out[pozmin].b = in[i].b;
printf ("DUPA ***** %lu %lu\n", out[pozmin].a,out[pozmin].b);
}
}
printf ("\n out a \n");
for (i=0;i<k;i++)
printf ("%lu ",out[i].a);
printf ("\n out b \n");
for (i=0;i<k;i++)
printf ("%lu ",out[i].b);
printf ("\n greutate maxima la la la %lu \n" , gmax);
fprintf(g, "%lu\n",gmax);
return 0;
}