보석 도둑 (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;
}