#include<stdio.h>
#include <algorithm>
#include <list>
#include <map>
using namespace std;
#define min(a,b) (a < b)?(a):(b)
struct gutuie{
int h,g;
};
unsigned int getLevel(gutuie Gutuie, int H, int U){
if(H >= Gutuie.h)
return (1+getLevel(Gutuie,H-U,U));
return 0;
}
bool compare(const gutuie &g1, const gutuie &g2){
return g1.g > g2.g;
}
map<unsigned int, list<gutuie> > Gutui;
bool countHeavier(unsigned int level,unsigned int nrNiv,unsigned int chosen){
unsigned int i, counter;
for(i = level+1;i<nrNiv+1;i++){
counter = 0;
list<gutuie>::iterator it;
for(it = (Gutui[i]).begin(); it != (Gutui[i]).end(); it++)
if((Gutui[level].front().g) < (*it).g)
counter++;
if(counter >= i-chosen+1)
return true;
}
return false;
}
unsigned int GMAX(unsigned int nrNiv, unsigned int N){
unsigned int i,chosen=0,gr = 0,numarGutui=0,impr=0;
for(i=1;i<nrNiv+1;i++){
if(Gutui[i].empty())
impr++;
else{
if(Gutui[i].size() ==1)
numarGutui++;
else{
if(impr>Gutui[i].size()-1){
numarGutui+=Gutui[i].size();
impr-=(Gutui[i].size()-1);
}
else{
numarGutui+=(impr+1);
impr = 0;
}
}
}
}
for(i=1;i<nrNiv+1;i++){
if(i<=chosen)
i=chosen+1;
// printf("iteratia %i Mai sunt %i nivele\n",i,nrNiv-i);
if(!Gutui[i].empty()){
// printf("Acum ar trebui sa fac ceva i-chosen: %i\n", (i-chosen) );
if(!countHeavier(i,nrNiv,chosen)){
gr += (Gutui[i].front().g);
// printf("Adaug asta la greutate:%i %i\n",Gutui[i].front().h,Gutui[i].front().g);
Gutui[i].pop_front();
chosen++;
i--;
N--;
numarGutui--;
}
else
N-=Gutui[i].size();
}
}
return gr;
}
int main(){
unsigned int N,H,U,nrNiv,i;
gutuie Gutuie;
FILE *f=fopen("gutui.in","r"), *g=fopen("gutui.out","w");
fscanf(f,"%u %u %u\n",&N,&H,&U);
nrNiv = H/U;
for(i=0;i<N;i++){
fscanf(f, "%u %u\n", &(Gutuie.h), &(Gutuie.g));
Gutui[getLevel(Gutuie,H,U)].push_front(Gutuie);
}
for(i=1;i<1+nrNiv;i++){
//fprintf(g, "\n%i.",i);
// list<gutuie>::iterator it;
Gutui[i].sort(compare);
// for(it = (Gutui[i]).begin(); it != (Gutui[i]).end(); it++)
// fprintf(g,"%i %i|", (*it).h, (*it).g);
}
fprintf(g,"%u", GMAX(nrNiv, N));
//scanf("%i",&N);
fclose(f);
fclose(g);
return 0;
}