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 C# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args) {
        //MyDebugger.MakeTestCase("../TextFile2.txt"); return;
#if DEBUG
        MyDebugger.Test(process, "../TextFile1.txt");
#else
        object ret = process(new StreamReader(Console.OpenStandardInput()));
        Console.WriteLine(ret);
#endif
    }

    static object process(TextReader input) {
        var s     = input.ReadLine();
        var spl   = s.Split(' ');
        int n     = int.Parse(spl[0]);
        int m     = int.Parse(spl[1]);

        long count = 0;

        var sw = new Stopwatch();

        sw.Start();
        var list = new List<item>(n);
        for(int i=0; i<n; i++) {
            s     = input.ReadLine();
            spl   = s.Split(' ');
            var itm = new item();
            itm.a = int.Parse(spl[0]);
            itm.b = int.Parse(spl[1]);
            if (itm.a > m) continue;
            list.Add(itm);
        }

        list.Sort((x1, x2) => {
            if (x2.b - x1.b == 0) return (x2.a - x1.a);
            return x2.b - x1.b;
        });

        var list2 = new LinkedList<item>(list);

        //int[] day = new int[m+1];
        for (var i=m-1; i>=0; i--) {
            foreach(var itm in list2) {
                if(i+itm.a <= m) {
                    count += itm.b;
                    list2.Remove(itm);
                    break;
                }
            }
        }

        return count;
    }
}

class item
{
    public int a;
    public int b;
}