Problem:
Score : 400 points

Problem Statement

There are N one-off jobs available. If you take the i-th job and complete it, you will earn the reward of B_i after A_i days from the day you do it.

You can take and complete at most one of these jobs in a day.

However, you cannot retake a job that you have already done.

Find the maximum total reward that you can earn no later than M days from today.

You can already start working today.

Constraints

All values in input are integers.

1 \leq N \leq 10^5

1 \leq M \leq 10^5

1 \leq A_i \leq 10^5

1 \leq B_i \leq 10^4

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 maximum total reward that you can earn no later than M days from today.

Sample Input 1

3 4
4 3
4 1
2 2

Sample Output 1

5

You can earn the total reward of 5 by taking the jobs as follows:

Take and complete the first job today. You will earn the reward of 3 after four days from today.

Take and complete the third job tomorrow. You will earn the reward of 2 after two days from tomorrow, that is, after three days from today.

Sample Input 2

5 3
1 2
1 3
1 4
2 1
2 3

Sample Output 2

10

Sample Input 3

1 1
2 1

Sample Output 3

0

Solution in Python (3.4.3) (judge verdict: Wrong Answer)

NM = input()
N = int(NM.split(' ')[0])
M = int(NM.split(' ')[1])
each_days_map = {}
each_days_mapsorted_list = []
for i in range(N):
    ab = input()
    a = int(ab.split(' ')[0])
    b = int(ab.split(' ')[1])
    if a > M:
        break 
    if a in each_days_map.keys():
        for idx in range(len(each_days_map[a])):
            if b > each_days_map[a][idx]:
                each_days_map[a].insert(idx,b)
                if len(each_days_map[a]) > (M - a + 1):
                    each_days_map[a].pop()
                break
        if M > len(each_days_map[a]) and (M - a + 1) > len(each_days_map[a]):
            each_days_map[a].append(b)
    else:
        each_days_map[a] = [b]

fixed_max_list = [0]
for max_list in each_days_map.values():
    for num in max_list:
        list_len = len(fixed_max_list)
        insert_flag = True
        for idx in range(list_len):
            if num > fixed_max_list[idx]:
                fixed_max_list.insert(idx,num)
                insert_flag = False
                if len(fixed_max_list) >= M:
                    fixed_max_list.pop()
                break
        if M > len(fixed_max_list) and insert_flag:
            fixed_max_list.append(b)
print(sum(fixed_max_list))