module subprogram
	implicit none
	contains
	subroutine heapsort2(n,array,turn)
		implicit none
		integer(8),intent(in)::n
		integer(8),intent(out)::turn(1:n)
		integer(8),intent(inout)::array(1:n)
  
		integer(8)::i,k,j,l,m
		integer(8)::t
  
		if(n.le.0)then
			write(6,*)"Error, at heapsort"; stop
		endif
		if(n.eq.1)return
 
		do i=1,N
			turn(i)=i
		enddo
 
		l=n/2+1
		k=n
		do while(k.ne.1)
			if(l.gt.1)then
				l=l-1
				t=array(l)
				m=turn(l)
			else
				t=array(k)
				m=turn(k)
				array(k)=array(1)
				turn(k)=turn(1)
				k=k-1
				if(k.eq.1) then
					array(1)=t
					turn(1)=m
					exit
				endif
			endif
			i=l
			j=l+l
			do while(j.le.k)
				if(j.lt.k)then
					if(array(j).lt.array(j+1))j=j+1
				endif
				if (t.lt.array(j))then
					array(i)=array(j)
					turn(i)=turn(j)
					i=j
					j=j+j
				else
					j=k+1
				endif
			enddo
			array(i)=t
			turn(i)=m
		enddo
 
		return
	end subroutine heapsort2
end module subprogram	

program main
	use subprogram
	implicit none
	integer(8) :: N, M, i
	integer(8), allocatable :: A(:), B(:), turn(:)
	integer(8) :: ans
	read(*, *) N, M
	allocate(A(1:N), B(1:N), turn(1:N))
	do i = 1, N
		read(*, *) A(i), B(i)
	end do
	call heapsort2(N,A,turn)
	ans = 0
	do i = 1, N
		if(M - B(turn(i)) >= 0) then
			ans = ans + B(turn(i))*A(i)
			M   = M - B(turn(i))
		else
			ans = ans + A(i)*M
			exit
		end if
	end do
	write(*, *) ans
end program main