import heapq



N, M = [int(x) for x in input().split()]

AB = [0] * N



for i in range(N):

    AB[i] = [int(x) for x in input().split()]



AB = sorted(AB)



jobs = set()

answer = 0

nextpush = 0

candidates = []



for day in range(M)[::-1]:

    while nextpush < N:

        a, b = AB[nextpush]

        if day + a <= M:

            heapq.heappush(candidates, (-b, a))

            nextpush+=1

        else:

            break

    if candidates:

        b, a = heapq.heappop(candidates)

        answer -= b

print(answer)







# 優先度キューを使う

import heapq



N, M = [int(x) for x in input().split()]

AB = [0] * N



for i in range(N):

    AB[i] = [int(x) for x in input().split()]



# 毎日、候補となる集合を再計算すると間に合わない

# M-1日後から当日に向けて計算してけば、

# day 日時点で day + a = M となる仕事だけを候補に追加することで

# day + 1日までに追加した候補を再利用できる。

# さらに、候補からpopした要素は次回から考慮しないため、設問の条件とも一致する。



# 仕事の候補、徐々に追加していく

candidates = []

# nextpush 次に候補としてpush するか判定するcandidates の添え字

nextpush = 0



# 期間の短いものから候補に入れていくので期間でソートしておく

# AB[i][0] が期間なので、キー指定不要



AB = sorted(AB)



# 回答

answer = 0



for day in range(M)[::-1]:

    while nextpush < N:

        a, b = AB[nextpush]

        if day + a == M:

            # 給料が高い順ものを優先して取り出したいので、-b をキューにいれる。

            heapq.heappush(candidates, -b)

            nextpush += 1

        else:

            # AB はソート済みなので、これ以降の要素に候補に追加できるものはない

            # 次回は nextpush から再開する。

            break

    if candidates: # 仕事が出来ない日もあるかも・・・

        b = heapq.heappop(candidates)

        # マイナスで入れてるので、符号を逆にして戻す

        answer -= b



print(answer)

import heapq

N, M = [int(x) for x in input().split()]
AB = [0] * N
for i in range(N):
    AB[i] = [int(x) for x in input().split()]
AB = sorted(AB)
jobs = set()
answer = 0
nextpush = 0
candidates = []
for day in range(M)[::-1]:
    while nextpush < N:
        a, b = AB[nextpush]
        if day + a <= M:
            heapq.heappush(candidates, (-b, a))
            nextpush += 1
        else:
            break
    if candidates:
        b, a = heapq.heappop(candidates)
        answer -= b
print(answer)

# 優先度キューを使う
import heapq

N, M = [int(x) for x in input().split()]
AB = [0] * N
for i in range(N):
    AB[i] = [int(x) for x in input().split()]
# 毎日、候補となる集合を再計算すると間に合わない
# M-1日後から当日に向けて計算してけば、
# day 日時点で day + a = M となる仕事だけを候補に追加することで
# day + 1日までに追加した候補を再利用できる。
# さらに、候補からpopした要素は次回から考慮しないため、設問の条件とも一致する。
# 仕事の候補、徐々に追加していく
candidates = []
# nextpush 次に候補としてpush するか判定するcandidates の添え字
nextpush = 0
# 期間の短いものから候補に入れていくので期間でソートしておく
# AB[i][0] が期間なので、キー指定不要
AB = sorted(AB)
# 回答
answer = 0
for day in range(M)[::-1]:
    while nextpush < N:
        a, b = AB[nextpush]
        if day + a == M:
            # 給料が高い順ものを優先して取り出したいので、-b をキューにいれる。
            heapq.heappush(candidates, -b)
            nextpush += 1
        else:
            # AB はソート済みなので、これ以降の要素に候補に追加できるものはない
            # 次回は nextpush から再開する。
            break
    if candidates:  # 仕事が出来ない日もあるかも・・・
        b = heapq.heappop(candidates)
        # マイナスで入れてるので、符号を逆にして戻す
        answer -= b
print(answer)

+# 優先度キューを使う +# 毎日、候補となる集合を再計算すると間に合わない +# M-1日後から当日に向けて計算してけば、 +# day 日時点で day + a = M となる仕事だけを候補に追加することで +# day + 1日までに追加した候補を再利用できる。 +# さらに、候補からpopした要素は次回から考慮しないため、設問の条件とも一致する。 +# 仕事の候補、徐々に追加していく +candidates = [] +# nextpush 次に候補としてpush するか判定するcandidates の添え字 +nextpush = 0 +# 期間の短いものから候補に入れていくので期間でソートしておく +# AB[i][0] が期間なので、キー指定不要 -jobs = set() +# 回答 -nextpush = 0 -candidates = [] -        if day + a <= M: -            heapq.heappush(candidates, (-b, a)) +        if day + a == M: +            # 給料が高い順ものを優先して取り出したいので、-b をキューにいれる。 +            heapq.heappush(candidates, -b) +            # AB はソート済みなので、これ以降の要素に候補に追加できるものはない +            # 次回は nextpush から再開する。 -    if candidates: -        b, a = heapq.heappop(candidates) +    if candidates:  # 仕事が出来ない日もあるかも・・・ +        b = heapq.heappop(candidates) +        # マイナスで入れてるので、符号を逆にして戻す