#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printVec(int *v, int n)
{
int i;
for ( i = 0; i<n; i++)
printf("%.3d ",v[i]);
printf("\n");
}
int min(int a, int b)
{
return (a < b) ? a : b;
}
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]);
int aux[N];
mergeSort(h,w,0,N-1,H,U);
printVec(h,N);
printVec(w,N);
printf("\n");
i = 0;
int p = 0;int k;
while (i<N){
int nivel = (H-h[i])/U;
j = 0;
while( (H-h[i])/U==nivel && j<=nivel){
aux[p++] = w[i++];
j++;
}
while( (H-h[i])/U==nivel)
i++;
for ( k=0; k< p-1;k++)
for (j = i+1; j<p;j++)
if (aux[k]<aux[j]){
int help = aux[k];
aux[k] = aux[j];
aux[k] = help;
}
p = min(nivel+1,p);
}
printf("%d\n",p);
printVec(aux,p);
int Gmax = 0;
j = 0;
int length = min(H/U,p);
for ( i = 0; i<length; i++)
Gmax+=aux[i];
fprintf(g,"%d\n",Gmax);
fclose(f);
fclose(g);
return 0;
}