#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;
};
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<int, list<gutuie> > Gutui;
int countHeavier(int level, int nrNiv){
int i, counter=0;
for(i = level+1;i<nrNiv+1;i++){
list<gutuie>::iterator it;
for(it = (Gutui[i]).begin(); it != (Gutui[i]).end(); it++)
if((Gutui[level].front().g) < (*it).g)
counter++;
}
return counter;
}
int GMAX(int nrNiv, int N){
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 CH: %i\n", (i-chosen), countHeavier(i,nrNiv));
if(i-chosen+1 > countHeavier(i,nrNiv) || N == numarGutui){
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(){
int N,H,U,nrCautat,nrNiv,i;
gutuie Gutuie;
FILE *f=fopen("gutui.in","r"), *g=fopen("gutui.out","w");
fscanf(f,"%i %i %i\n",&N,&H,&U);
nrNiv = H/U;
for(i=0;i<N;i++){
fscanf(f, "%i %i\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,"%i", GMAX(nrNiv, N));
fclose(f);
fclose(g);
return 0;
}