보석 도둑 (1202) : https://www.acmicpc.net/problem/1202

// 가방 중에 작은 무게부터 그 무게 이하의 최대 가격의 보석을 찾아야 함.
// 가방 list 정렬 해야하고, (30만개)
// 근데 문제는 그 무게 이하의 보석들을 가치 순으로 정렬한다고 하면. 정렬을 30만번 해야할 수도 있음.
// 계속 정렬을 하는 게 아니라 priority queue를 쓰자.

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

const int MAX_N = 300000;
int N, K;

pair<int, int> Jewels[MAX_N];
int Bags[MAX_N];

long long Total = 0;

void Input()
{
	cin >> N >> K;

	for (int i = 0; i < N; ++i)
	{
		cin >> Jewels[i].first >> Jewels[i].second;
	}
	for (int i = 0; i < K; ++i)
	{
		cin >> Bags[i];
	}
}

void Func()
{
	sort(Jewels, Jewels + N);
	sort(Bags, Bags + K);
	
	int Cnt = 0;
	priority_queue<int, vector<int>, less<int>> PQ;

	for (int i = 0; i < K; ++i)
	{
		while ((Cnt < N) && (Jewels[Cnt].first <= Bags[i]))
		{
			PQ.push(Jewels[Cnt].second);
			Cnt++;
		}
		if (PQ.empty()) continue;
		else
		{
			Total += PQ.top();
			PQ.pop();
		}
	}
}

int main()
{
	ios::sync_with_stdio(false), cin.tie(0);

	Input();
	Func();

	cout << Total;

	return 0;
}