Problem:
Problem C: Ball

Problem

$N$個のボールがあり、各ボールには色と価値が決められている。

ボールの色は$1$から$C$まで$C$種類存在し、各色ごとに選べるボールの数の上限が決められている。

ボールを全体で高々$M$個選ぶとき、得られる価値の合計を最大化せよ。

Input

入力は以下の形式で与えられる。

$N$ $M$ $C$
$l_1$ $l_2$ ... $l_C$
$c_1$ $w_1$
$c_2$ $w_2$
...
$c_N$ $w_N$

入力はすべて整数で与えられる。

1行目に$N$, $M$, $C$が空白区切りで与えられる。

2行目に色$i$の選べるボールの数の上限$l_i$($1 \leq i \leq C$)が空白区切りで与えられる。

3行目以降の$N$行にボール$i$の色$c_i$と価値$w_i$($1 \leq i \leq N$)が空白区切りで与えられる。

Constraints

入力は以下の条件を満たす。

$1 \leq M \leq N \leq 10^5 $

$1 \leq C \leq 10^5 $

$0 \leq l_i \leq N $

$1 \leq c_i \leq C $

$1 \leq w_i \leq 1000 $

Output

得られる価値の最大値を1行に出力せよ。

Sample Input 1

3 3 2
1 1
1 1
1 100
2 10

Sample Output 1

110

2番目と3番目のボールを選ぶのが最適である。

Sample Input 2

3 3 3
1 0 1
1 1
2 100
3 1

Sample Output 2

2

ある色のボールが一個も選べない場合もある。

Sample Input 3

22 7 26
11 14 15 3 11 7 16 17 1 4 2 19 4 14 16 16 3 13 17 12 7 11 2 20 12 22
6 10
1 3
13 1
16 5
4 1
20 7
18 4
26 6
9 1
12 2
21 1
21 7
18 1
14 5
24 5
6 1
3 1
2 5
21 2
7 6
10 9
15 7

Sample Output 3

52

Solution in C (judge verdict: Accepted)

/*
 * 3028_Ball.c
 *
 *  Created on: 2019/05/19
 *      Author: nagashima
 */

#include <stdio.h>
#include <stdlib.h>

typedef struct ball{
	int color;
	int value;
}ball;

ball aux[1000*100];

void merge(ball a[], int l, int m, int r);
void mergesort(ball a[], int l, int r);

int main(){
	int N,M,C;
	int *l;
	ball *b;
	int res=0;
    int count=0;

	scanf("%d %d %d",&N,&M,&C);
	l=(int *)malloc(C*sizeof(int));
	b=(ball *)malloc(N*sizeof(ball));
	for(int i=0;i<C;i++)scanf("%d",&l[i]);
	for(int i=0;i<N;i++)scanf("%d %d",&b[i].color,&b[i].value);

    mergesort(b, 0, N-1);

    for(int i=N-1;i>-1;i--){
    	//printf("i:%2d color:%2d color_num:%2d value:%2d\n",i,b[i].color,l[b[i].color-1],b[i].value);
    	if(l[b[i].color-1]>0){
    		res+=b[i].value;
    		l[b[i].color-1]--;
    		count++;
    	}
    	if(count>=M)break;
    }



	printf("%d\n",res);

	free(l);
	free(b);
	return 0;
}

void merge(ball a[], int l, int m, int r){
	int i, j, k;
	for(i=m+1;i>l;i--)aux[i-1]=a[i-1];
	for(j=m;j<r;j++)aux[r+m-j]=a[j+1];
	for(k=l;k<=r;k++)
		if(aux[j].value<aux[i].value)
			a[k]=aux[j--];
		else
			a[k]=aux[i++];
}
void mergesort(ball a[], int l, int r){
	int m=(r+l)/2;
	if(r<=l)return;
	mergesort(a, l, m);
	mergesort(a, m+1, r);
	merge(a, l, m, r);
}