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

// 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], 10);
  var m = parseInt(tmp[1], 10);


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

  table = sortByDay(table);

	var tableByDay = [];
	var startSlice = 0;
	var startDay = table[startSlice][0];
	for (var i = 0; i < table.length; i++) {
		var cursorDay = table[i][0];
		if(startDay != cursorDay){
			tableByDay[startDay] = table.slice(startSlice, i);
			startSlice = i;
			startDay = table[startSlice][0];
		}

		if(i == (table.length-1)){
			tableByDay[startDay] = table.slice(startSlice, table.length);
		}
	}

  var checkTable = []
	var sum = 0;
  for (var day = 1; day <=m ; day++) {
		if(tableByDay[day]){
			checkTable = checkTable.concat(tableByDay[day]);
			checkTable = sortByReward(checkTable);
		}

    if(checkTable.length > 0){
      var choice = checkTable.pop();
      sum += choice[1];
    }
  }

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

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

function sortByDay(table){
  return table.sort(function(a,b){
		return a[0] - b[0];
    // 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){
		return a[1] - b[1];
    // 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(' ');
}