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: Wrong Answer)

using System;
using System.Linq;
using System.Collections.Generic;

class Program {
  static void Main() {
    string[] input = Console.ReadLine().Trim().Split(' ');
    int N = int.Parse(input[0]);
    int term = int.Parse(input[1]);
    var list = new List<Job>();
    int days, reward;
    int answer = 0;
    
    for(var i = 0; i < N; i++) {
      input = Console.ReadLine().Trim().Split(' ');
      days = int.Parse(input[0]);
      reward = int.Parse(input[1]);
      if(days <= term) {
        Job job = new Job(days, reward);
      	list.Add(job);
      }
    }
    
    //list = list.OrderBy(x => -x.days).ThenBy(x => -x.reward).ToList();
    list = list.OrderBy(x => -x.reward).ThenBy(x => -x.days).ToList();
    
    /*
    for(var i = 0; i < list.Count(); i++) {
      Console.WriteLine(list[i].days + " " + list[i].reward);
    }
    */
    
    for(var i = term; i > 0; i--) {
      list.RemoveAll(x => x.days > i);
      if(list.Count() == 0) {
        break;
      }
      if(list[0].days <= i) {
        answer += list[0].reward;
        list.Remove(list[0]);
      }
    }
    Console.WriteLine(answer);
  }
  
  private struct Job {
  	public int days;
  	public int reward;
    
    public Job(int days, int reward) {
      this.days = days;
      this.reward = reward;
    }
  }
}