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 (Clang 3.8.0) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
 
int main()
{
    int N,M,i,j,day,ibest;
    int Nmax = 100000;
    int Mmax = 100000;
    int A[Nmax+1],B[Nmax+1];
    int Selected[Nmax+1];
    int tmp=0,sum=0;
  
    /*
    D - Summer Vacation
    N件の日雇いアルバイトがありi件目の日雇いアルバイトを請けて働くと、その Ai日後に報酬 Biが得られます。
    あなたは、これらの中から 1日に 1件まで選んで請け、働くことができます。
    ただし、請けたことのある日雇いアルバイトは選べません。
    今日から M日後まで(M日後を含む)に得られる報酬の合計の最大値を求めてください。
    なお、日雇いアルバイトは今日から請けて働くことができます。
    1 <= Ai
    */

    // 入力読込
    scanf("%d", &N);
    scanf("%d", &M);
    
    for(i=1;i<=N;i++){
        scanf("%d", &A[i]);
        scanf("%d", &B[i]);
        Selected[i] = 0;
    }
    
    // 今日からday日後に受ける仕事を決める
    // 最終日（M-1）日の仕事から選択していく。
    sum =0;
    for(day=M-1 ; day>=0 ; day--){
        
        // 今日する仕事を選択
        // N個からM個を選ぶ問題 
        tmp =0;
        ibest = 0;
        for(i=1;i<=N;i++){
            
            if( ( A[i] <= (M-day) ) &&
                ( B[i] >= tmp ) &&
                ( Selected[i] == 0 )
               ){
                tmp = B[i];
                ibest = i;
            } 
            
        }
        
        // 選択可能な仕事があった時更新
        if(ibest != 0){
            sum += B[ibest];
            Selected[ibest] = 1;
        }             
    }
    
    printf("%d \n", sum);
  
  return 0;
   
}