Problem:
Score : 300 points

Problem Statement

Hearing that energy drinks increase rating in those sites, Takahashi decides to buy up M cans of energy drinks.

There are N stores that sell energy drinks. In the i-th store, he can buy at most B_i cans of energy drinks for A_i yen (the currency of Japan) each.

What is the minimum amount of money with which he can buy M cans of energy drinks?

It is guaranteed that, in the given inputs, a sufficient amount of money can always buy M cans of energy drinks.

Constraints

All values in input are integers.

1 \leq N, M \leq 10^5

1 \leq A_i \leq 10^9

1 \leq B_i \leq 10^5

B_1 + ... + B_N \geq M

Input

Input is given from Standard Input in the following format:

N M
A_1 B_1
A_2 B_2
\vdots
A_N B_N

Output

Print the minimum amount of money with which Takahashi can buy M cans of energy drinks.

Sample Input 1

2 5
4 9
2 4

Sample Output 1

12

With 12 yen, we can buy one drink at the first store and four drinks at the second store, for the total of five drinks. However, we cannot buy 5 drinks with 11 yen or less.

Sample Input 2

4 30
6 18
2 5
3 10
7 9

Sample Output 2

130

Sample Input 3

1 100000
1000000000 100000

Sample Output 3

100000000000000

The output may not fit into a 32-bit integer type.

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

// AtCorder用のTemplate
namespace Atcoder{
    public class main{

        // 標準入力用汎用関数
        static string readString(){return Console.ReadLine();}
        static int readInteger(){return int.Parse(Console.ReadLine());}
        static long readLong(){return long.Parse(Console.ReadLine());}
        static double readDouble(){return double.Parse(Console.ReadLine());}
        static decimal readDecimal(){return decimal.Parse(Console.ReadLine());}

        static List<char> readCharL(char separator=' '){return Console.ReadLine().Split(separator).Select((x) => Convert.ToChar(x)).ToList();}
        static List<string> readStringL(char separator=' '){return Console.ReadLine().Split(separator).ToList();}
        static List<int> readIntegerL(char separator=' '){return Console.ReadLine().Split(separator).Select((x) => int.Parse(x)).ToList();}

        static void print<T>(T args){Console.WriteLine(args);}
        static void printL<T>(List<T> _list){Console.WriteLine(string.Join(",", _list));}

        public static void Main(string[] args)
        {
            var tmp = readIntegerL();
            int N = tmp[0]; // 軒数
            int M = tmp[1]; // 買い求める本数
            var _list = new List<List<int>>();

            // 1本A円の栄養ドリンクをB本まで買うことができる
            foreach(var i in Enumerable.Range(0, N))
            {
                var store = readIntegerL();
                _list.Add(store);
            }
            _list.Sort((a, b) => a[0] - b[0]);
            long counter = 0;
            long summary = 0;
            /* 
            while(M > counter)
            {
            */
                foreach(var i in _list)
                {
                    if(counter >= M)
                    {
                        break;
                    }
                    for(var j = 0; i[1] > j; j++)
                    {
                        if(counter >= M)
                        {
                            break;
                        }
                        summary += i[0];
                        counter++;
                    }
                }
                Console.WriteLine(summary);
            // }
        }
    }
}