#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printVec(int *v,int *w, int n)
{
int i;
for ( i = 0; i<n; i++)
printf("%.2d %.2d\n",v[i],w[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-h[i])/U < (H-h[j])/U) || ((H-h[i])/U==(H-h[j])/U && (w[i]>w[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 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);
}
}
int main()
{
int N,H,U;
FILE *f, *g;
f = fopen("gutui.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);
printVec(h,w,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;
}