-- 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, 10^5) jobs
  print $ solve m joba

solve m a = fst . foldl' f (0, []) $ [1..m]
  where
    f (n, ns) m = case merge' ns (a!m) of
      (k:ks) -> (n+k, ks)
      [] -> (n, ns)
    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)