#include<stdio.h>
#include<stdlib.h>
typedef struct{
int inaltime_gutuie;
int greutate_gutuie;
}gutuie;
int compare_inaltime(const void* a,const void *b)
{
gutuie *ia = (gutuie *)a;
gutuie *ib = (gutuie *)b;
return (ib->inaltime_gutuie - ia->inaltime_gutuie);
}
/*int compare_greutate(const void *a,const void *b)
{
gutuie *ia = (gutuie *)a;
gutuie *ib = (gutuie *)b;
return (ib->greutate_gutuie - ia->greutate_gutuie);
}*/
int main()
{
FILE *fin = fopen("gutui.in","r");
FILE *fout = fopen("gutui.out","w");
gutuie g[100000];
gutuie aux;
int nr_gutui,inaltime_maxima,inaltime_crengi;
int i,ok,j,greutate_maxima=0,inceput,t,t1,t2;
//int inaltime_gutuie[10000],greutate_gutuie[10000];
fscanf(fin,"%d",&nr_gutui);
fscanf(fin,"%d",&inaltime_maxima);
fscanf(fin,"%d",&inaltime_crengi);
for(i=0;i<nr_gutui;i++)
{
fscanf(fin,"%d",&g[i].inaltime_gutuie);
fscanf(fin,"%d",&g[i].greutate_gutuie);
}
//afisare inainte de sortare
printf("%d %d %d\n",nr_gutui,inaltime_maxima,inaltime_crengi);
for(i=0;i<nr_gutui;i++)
printf("%d %d \n",g[i].inaltime_gutuie,g[i].greutate_gutuie);
printf("\n");
qsort(g,nr_gutui,sizeof(gutuie),compare_inaltime);
printf("%d %d %d\n",nr_gutui,inaltime_maxima,inaltime_crengi);
for(i=0;i<nr_gutui;i++)
printf("%d %d \n",g[i].inaltime_gutuie,g[i].greutate_gutuie);
printf("\n");
i=1;
while(i<nr_gutui)
{
if (g[i].inaltime_gutuie/10 == g[i-1].inaltime_gutuie/10)
{
inceput=i-1;
while(g[i].inaltime_gutuie/10 == g[i-1].inaltime_gutuie/10 && i<nr_gutui)
i++;
// qsort(g,i,sizeof(gutuie),compare_greutate);
//acum facem sortarea dupa greutate
do{
ok=0;
for(j=inceput;j<=i-2;j++)
{
if (g[j].greutate_gutuie<g[j+1].greutate_gutuie)
{
/*aux = g[j].greutate_gutuie; tmp = g[j].inaltime_gutuie;
g[j].greutate_gutuie = g[j+1].greutate_gutuie; g[j].inaltime_gutuie = g[j+1].inaltime_gutuie;
g[j+1].greutate_gutuie = aux; g[j+1].inaltime_gutuie = tmp;*/
aux = g[j];
g[j] = g[j+1];
g[j+1] = aux;
ok=1;
}
}
}while(ok);
}
else{
i++;}
}
//qsort(g,nr_gutui,sizeof(gutuie),compare_inaltime);
printf("%d %d %d\n",nr_gutui,inaltime_maxima,inaltime_crengi);
for(i=0;i<nr_gutui;i++)
printf("%d %d \n",g[i].inaltime_gutuie,g[i].greutate_gutuie);
printf("\n");
//parcurgem toate gutuile
while(i<nr_gutui)
{
//cazul controversat
if(g[i].inaltime_gutuie == inaltime_maxima)
{
j=i+1;
if(j<nr_gutui)
{
if(g[j].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j].inaltime_gutuie<inaltime_maxima&&g[j+1].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j+1].inaltime_gutuie<inaltime_maxima&&g[j].greutate_gutuie>g[i].greutate_gutuie)
{
if(g[j+1].greutate_gutuie>g[i].greutate_gutuie)
{
greutate_maxima+=g[j].greutate_gutuie;
//trecut=1;
for(t=j+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i=j+1;
}
if(g[j+1].greutate_gutuie<g[i].greutate_gutuie)
{
greutate_maxima+=g[i].greutate_gutuie;
for(t=i+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i=i+1;
}
}
if(g[j].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j].inaltime_gutuie<inaltime_maxima&&g[j+1].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j+1].inaltime_gutuie<inaltime_maxima&&g[j].greutate_gutuie<g[i].greutate_gutuie)
{
greutate_maxima+=g[i].greutate_gutuie;
for(t=i+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i=i+1;
}
if(g[j].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j].inaltime_gutuie<inaltime_crengi&&g[j+1].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j+1].inaltime_gutuie<inaltime_maxima&&g[j].greutate_gutuie==g[i].greutate_gutuie)
{
if(g[i+1].inaltime_gutuie==inaltime_maxima&&g[j+1].greutate_gutuie>g[i+1].greutate_gutuie)
{
greutate_maxima+=g[j].greutate_gutuie;
for(t=j+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i=j+1;
}
if(g[i+1].inaltime_gutuie==inaltime_maxima&&g[j+1].greutate_gutuie<g[i+1].greutate_gutuie)
{
greutate_maxima+=g[i].greutate_gutuie;
for(t=i+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i=i+1;
}
if(g[i+1].inaltime_gutuie==inaltime_maxima&&g[j+1].greutate_gutuie==g[i+1].greutate_gutuie)
{
t1=i+2;
t2=j+2;
do{
if(g[t1].greutate_gutuie>g[t2].greutate_gutuie)
{
greutate_maxima+=g[i].greutate_gutuie;
for(t=i+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i=i+1;
}
if(g[t2].greutate_gutuie<=g[t1].greutate_gutuie)
{
greutate_maxima+=g[j].greutate_gutuie;
for(t=j+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i=j+1;
}
t1++;
t2++;
}while(g[t1].inaltime_gutuie!=inaltime_maxima);
}
}
if(g[j].inaltime_gutuie>=inaltime_maxima-inaltime_crengi&&g[j].inaltime_gutuie<inaltime_maxima&&g[j+1].inaltime_gutuie<inaltime_maxima-inaltime_crengi)
{
greutate_maxima+=g[i].greutate_gutuie;
for(t=i+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i=i+1;
}
}
}
if(g[i].inaltime_gutuie<inaltime_maxima)
{
greutate_maxima+=g[i].greutate_gutuie;
for(t=i+1;t<nr_gutui;t++)
g[t].inaltime_gutuie+=inaltime_crengi;
i++;
}
}
printf("%d",greutate_maxima);
fprintf(fout,"%d\n",greutate_maxima);
fclose(fout);
fclose(fin);
return 0;
}