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>
long long int a[100005], b[100005];
int asc(const void* x, const void* y)
{
	if (b[*(int*)x] < b[*(int*)y])return 1;
	if (b[*(int*)x] > b[*(int*)y])return -1;
	return 0;
}
int main()
{
	long long int n, m;
	scanf("%lld %lld", &n, &m);
	long long int i, j;
	for (i = 0; i < n; i++)
		scanf("%lld %lld", &a[i], &b[i]);
	int p[100005];
	for (i = 0; i < m; i++)
		p[i] = 0;
	long long int ans = 0;
	int c[100005];
	for (i = 0; i < n; i++)
		c[i] = i;
	qsort(c, n, sizeof(int), asc);
	int count[1003];
	for (i = 0; i < 1003; i++)
		count[i] = 0;
	int k;
	for (i = 0; i < n; i++)
	{
		if (m - a[c[i]] >= 0)
		{
			k = 0;
			for (j = m - a[c[i]]; j % 100 > 0; j--)
			{
				if (p[j] == 0)
				{
					p[j] = 1;
					ans += b[c[i]];
					k++;
					count[j / 100]++;
					break;
				}
			}
			if (k > 0)
				continue;
			if (p[j] == 0)
			{
				p[j] = 1;
				ans += b[c[i]];
				count[j / 100]++;
				continue;
			}
			j--;
			j /= 100;
			while (j >= 0 && count[j] == 100)
				j--;
			if (j < 0)
				continue;
			for (j = j * 100; j >= 0; j--)
			{
				if (p[j] == 0)
				{
					p[j] = 1;
					ans += b[c[i]];
					count[j / 100]++;
					break;
				}
			}
		}
	}
	printf("%lld\n", ans);
	return 0;
}