-- ABC 137 D
import Data.Maybe
import Data.Char
import Data.List
import Data.Array
import Control.Monad
import qualified Data.ByteString.Char8 as BS
import qualified Data.Vector.Unboxed as VU

main :: IO ()
main = do
  [n, m] <- getIntList
  jobs <- replicateM n getIntPair
  let joba = accumArray ((flip . insertBy . flip) compare) [] (1, m) jobs
  print . fst $ foldl' (\(n, ns) m -> let (k:ks) = merge' ns (joba!m) in (n+k, ks)) (0, []) [1..m]
    where
      merge' ns [] = ns
      merge' [] ms = ms
      merge' (n:ns) (m:ms)
        | n < m = m : merge' (n:ns) ms
        | otherwise = n : merge' ns (m:ms)

readInt :: BS.ByteString -> Int
readInt = fst . fromJust . BS.readInt

getInt :: IO Int
getInt = readInt <$> BS.getLine

getIntList :: IO [Int]
getIntList = unfoldr (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine

getIntVec :: Int -> IO (VU.Vector Int)
getIntVec n = VU.unfoldrN n (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine

getIntPair :: IO (Int, Int)
getIntPair = do
  [a, b] <- getIntList
  return (a, b)