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 Ruby (2.3.3) (judge verdict: Time Limit Exceeded)

str = gets.split
N,M = str[0].to_i, str[1].to_i
a = Array.new(N){Array.new(2,0)}
b = Array.new(M+1,0)

for i in 0...N do
    str = gets.split
    x,y = str[0].to_i,str[1].to_i
    if M >= x
        a[i][0],a[i][1] = x,y
        b[x] = b[x]+1
    else
        b[0] = b[0]+1
    end
end

a.sort_by! {|x| [x[0], -x[1]]}
for i in 1..M do
    b[i] += b[i-1]
end

c = Array.new(0)
d = 0
answer = 0
max = 0
max_n = 0
for i in 1..M do
    if c.size > 0
        max = a[c.last][1]
        max_n = c.size-1
        if b[i] != b[i-1]
            max_n += 1
            if max <= a[b[i-1]][1]
                max = a[b[i-1]][1]
                c.push(b[i-1])
            else
                l = 0
                r = max_n
                lr = (l+r)/2
                while l != r
                    if a[c[lr]][1] < a[b[i-1]][1]
                        l = lr+1
                    else
                        r = lr
                    end
                end
                c.insert(l,b[i-1])
            end
        end
        answer += max
        c[max_n] += 1
        d = c[max_n]
        if d < a.size
            if a[d][0] != a[d-1][0]
                c.delete_at(max_n)
            end
        else
            c.delete_at(max_n)
        end
    elsif b[i] != b[i-1]
        c.push(b[i-1])
        answer += a[c[0]][1]
        c[0] += 1
        d = c[0]
        if d < a.size
            if a[d][0] != a[d-1][0]
                c.delete_at(max_n)
            end
        else
            c.delete_at(max_n)
        end
    end
    if c.size >= 2
        if a[c.last][1] < a[c[-2]][1]
            l = 0
            r = c.size-1
            lr = (l+r)/2
            while l != r
                if a[c[lr]][1] < a[b[i-1]][1]
                    l = lr+1
                else
                    r = lr
                end
            end
            c.insert(l,c.pop)
        end
    end
end

puts answer