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 JavaScript (node.js v5.12) (judge verdict: Time Limit Exceeded)

function Main(input) {
  var len = parseInt(input.split("\n")[0].split(" ")[0]);
  var nissu = parseInt(input.split("\n")[0].split(" ")[1]);
  var list = [];
  var output = 0;
  for(var i = 1; i <= len; i++){
    var tmp = make(input.split("\n")[i]);
    if(tmp["a"] > nissu){
       continue;
    }
    list.push(tmp);
  }
  list.sort(function(a, b){
    if(a["a"] == b["a"]){
       return b["b"] - a["b"];
    }else{
       return a["a"] - b["a"];
    }
  });
  
 // console.log(list);
  
  for(var i = 0; i < nissu; i++){
    var max = 0;
    var lastSelect = -1;
    var breakFlag = false;
    for(var j = 0; j < list.length; j++){
      var tmp = list[j];
      if(tmp["a"] > i + 1){
        //console.log(JSON.stringify(tmp) + ",i:" + i + ",j:" + j + "NG");
        if(lastSelect == -1){breakFlag = true; /*console.log("lastなし");*/}
        break;
      }else{
        //console.log(JSON.stringify(tmp) + ",i:" + i + ",j:" + j + "OK");
         if(max < tmp["b"]){
           // console.log(JSON.stringify(tmp) + ",i:" + i + ",j:" + j + "OKOK");
            max = tmp["b"];
           lastSelect = j;
         }
      }
    }
    if(breakFlag){
       continue;
    }
    //console.log(max);
    list.splice(lastSelect, 1);
    output += max;
  }
  console.log(output);
}

function make(str){
  var tmp = {};
  tmp["a"] = parseInt(str.split(" ")[0]);
  tmp["b"] = parseInt(str.split(" ")[1]);
  return tmp;
}

Main(require("fs").readFileSync("/dev/stdin", "utf8"));