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: Runtime Error)

// inputに入力データ全体が入る
function Main(input) {
	// 1行目がinput[0], 2行目がinput[1], …に入る
	input = input.split("\n");
  var tmp = input[0].trim().split(' ');
  var n = parseInt(tmp[0]);
  var m = parseInt(tmp[1]);


  var table = [];
  for (var i = 1; i < input.length; i++) {
    var tmp = separateSpace(input[i]);
    table[i-1] = toIntAll(tmp);
  }

  table = sortByDay(table);


  // console.log(sortByDay(table));
  // console.log(sortByReward(table));
  // return;


  var sum = 0;
  var forgivenDay = 1;
  var sliceStartIndex = 0;
  var checkTable = []

  for (var i = 0; i < table.length; i++) {
    if(  (table[i][0] > forgivenDay) || (i == (table.length-1))  ){
      var tmpTable = table.slice(sliceStartIndex, i);
      checkTable = checkTable.concat(tmpTable);
      checkTable = sortByReward(checkTable);

      var choice = checkTable.pop();
      sum += choice[1];

      sliceStartIndex = i;
      forgivenDay++;
    }
  }


  while(forgivenDay <= m){
    var choice = checkTable.pop();
    sum += choice[1];

    console.log(choice);
    forgivenDay++;
  }

	//文字列から10進数に変換するときはparseIntを使います

	//出力
	console.log('%d',sum);
}
//*この行以降は編集しないでください（標準入出力から一度に読み込み、Mainを呼び出します）
Main(require("fs").readFileSync("/dev/stdin", "utf8"));

function sortByDay(table){
  return table.sort(function(a,b){
    if(a[0] - b[0] > 0) return 1;
    if(a[0] - b[0] < 0) return -1;
    return b[1] - a[1];
  });
}
function sortByReward(table){
  return table.sort(function(a,b){
    if(a[1] - b[1] > 0) return 1;
    if(a[1] - b[1] < 0) return -1;
    return b[0] - a[0];
  });
}

function toIntAll(input){
  var out = []
  for(var i=0; i<input.length; i++){
    out[i] = parseInt(input[i]);
  }
  return out;
}

//文字列をスペースで分割 -> array
function separateSpace(input){
  return input.trim().split(' ');
}