#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printVec(int *v, int n)
{
int i;
for ( i = 0; i<n; i++)
printf("%.2d ",v[i]);
printf("\n");
}
int max(int a, int b)
{
return (a < b) ? b : a;
}
void merge(int *h,int *w, int p, int q, int r, int H, int U) {
int i = p;
int j = q + 1;
int *tmp = (int*)malloc((r - p + 1) * sizeof(int));
int *tmp2 = (int*)malloc((r - p + 1) * sizeof(int));
int k = 0;
while ((i <= q) && (j <= r)) {
if ((h[i] > h[j] ) ){
tmp2[k] = w[i];
tmp[k++] = h[i++];
}
else{
tmp2[k] = w[j];
tmp[k++] = h[j++];
}
}
while (i <= q){
tmp2[k] = w[i];
tmp[k++] = h[i++];
}
while (j <= r){
tmp2[k] = w[j];
tmp[k++] = h[j++];
}
memcpy(h + p, tmp, (r - p + 1) * sizeof(int));
memcpy(w + p, tmp2, (r - p + 1) * sizeof(int));
free(tmp);
free(tmp2);
}
void merge2(int *h,int *w, int p, int q, int r, int H, int U) {
int i = p;
int j = q + 1;
int *tmp = (int*)malloc((r - p + 1) * sizeof(int));
int *tmp2 = (int*)malloc((r - p + 1) * sizeof(int));
int k = 0;
while ((i <= q) && (j <= r)) {
//printf("*%d\n ",h[i]+i*U);
if ((h[i]+i*U)<=H && (h[j] + i*U)<=H){
tmp2[k] = w[i];
tmp[k++] = h[i++];
}
else{
tmp2[k] = w[j];
tmp[k++] = h[j++];
}
}
while (i <= q){
tmp2[k] = w[i];
tmp[k++] = h[i++];
}
while (j <= r){
tmp2[k] = w[j];
tmp[k++] = h[j++];
}
memcpy(h + p, tmp, (r - p + 1) * sizeof(int));
memcpy(w + p, tmp2, (r - p + 1) * sizeof(int));
free(tmp);
free(tmp2);
}
void mergeSort(int *h, int *w, int p, int r,int H, int U)
{
if (p<r){
int q = (p+r)/2;
mergeSort(h,w,p,q,H,U);
mergeSort(h,w,q+1,r,H,U);
merge(h,w,p,q,r,H,U);
}
}
void mergeSort2(int *h, int *w, int p, int r,int H, int U)
{
if (p<r){
int q = (p+r)/2;
mergeSort2(h,w,p,q,H,U);
mergeSort2(h,w,q+1,r,H,U);
merge2(h,w,p,q,r,H,U);
}
}
int main()
{
int N,H,U;
FILE *f, *g;
f = fopen("G2.in","r");
g = fopen("gutui.out","w");
fscanf(f,"%d%d%d",&N,&H,&U);
int h[N],w[N];
int i,j;
for ( i = 0; i<N; i++)
fscanf(f,"%d %d\n",&h[i],&w[i]);
mergeSort(h,w,0,N-1,H,U);
//mergeSort2(h,w,0,N-1,H,U);
for ( i = 1; i<N; i++){
// printVec(h,N);
//printVec(w,N);
//printf("\n");
int hh = h[i];
int ww = w[i];
j = i-1;
int done = 1;
while (done)
if (ww>w[j] && hh + (j+1)*U >H ){
h[j+1] = h[j];
w[j+1] = w[j];
j--;
if (j<0)
done = 0;
}
else done = 0;
w[j+1] = ww;
h[j+1] = hh;
}
printVec(h,N);
printVec(w,N);
printf("\n");
int Gmax = 0;
j = 0;
for ( i = 0; i<N; i++)
if (h[i]+j*U<=H){
Gmax+=w[i];
j++;
}
fprintf(g,"%d\n",Gmax);
fclose(f);
fclose(g);
return 0;
}