//真心不是自己做出来的,太悲剧了,自己开始做得很复杂,而且有一大堆问题要解决,越写越麻烦,看了网上别个的解答过后,真的觉得妙呀,简直不是一个档次的
#include <iostream>
using namespace std;
int main()
{
int n,v,a,b,m;
int num[3002]={0};
while (cin>>n>>v)
{
m=0;
for (int i=0; i<n; i++)
{
cin>>a>>b;
num[a]+=b; //同时成熟的合并
}
for (int i=1; i<=3001; i++) //这里需要3001及以上,那不然3000这个数据会不对的,测试过得,(原因在于还可以有一天可以摘,而没有计算)
{
if(num[i]+num[i-1]<=v) //连续连个进行判断
{
m+=num[i]+num[i-1];
num[i]=num[i-1]=0; //摘完了
}
else
{
m+=v;
if(num[i-1]>=v)
{
num[i-1]-=v; //i-1天成熟这颗摘不完
}
else
{
num[i]=num[i]+num[i-1]-v; //i天成熟这颗摘不完,相当于放到第i天成熟的树上,还可以摘一次
}
}
}
cout<<m<<endl;
}
return 0;
}