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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
#include<stdlib.h>
 
int AB[100001][2];   //存放领工资的天数,存放工资数
int max_values[100001];  //最多可以领取的工资数
int max(int a,int b){
    return a > b ? a : b;
}
 
int cmp(const void * a,const void * b){
    int * ra = (int*)a;
    int * rb = (int*)b;
    //printf("[%d,%d]\n",ra[0],rb[0]);
    return ra[0] >= ra[1];
}
 
int main(){
    int N,M;    //N为工作总数,M为可支配的天数
    int i,j;
    int block = sizeof(int)*2;
    while(~scanf("%d%d",&N,&M)){
        for(i = 0; i < N; i++){    //初始化数据
            scanf("%d%d",&AB[i][0],&AB[i][1]);
        }
        qsort(AB,N,block,cmp);  //排序
        /*
        for(i = 0; i < N; i++){
            printf("%d,%d\n",AB[i][0],AB[i][1]);
        }
        continue;
        */
        for(i = 0; i <= M; i++){
            max_values[i] = 0;
        }
 
        for(i = 1; i <= N; i++){    //遍历所有工作
            int days = AB[i-1][0];  //等待时间
            int pays = AB[i-1][1];  //支付的费用
            //printf("%d,%d\n",days,pays);
            for(j = M; j > 0; j--){
                //printf("%d ",max_values[j]);
                max_values[j] = (days > j ? max_values[j] : max(max_values[j],pays+max_values[j-1]));
            }
            //puts("");
        }
 
        //for(i = 0; i <= M; i++)
        printf("%d\n",max_values[M]);
    }
    return 0;
}