Problem:
O: 千咲ちゃんと遠足 (Chisaki and Picnic)

幼稚園生の千咲ちゃんは、遠足にお菓子をもっていくことにした。

お菓子は $N$ 個あって、$i$ 番目のお菓子は値段が $A_i$ 円で、美味しさが $B_i$ である。

千咲ちゃんには友達が $M$ 人いて、$j$ 番目の友達は、値段が $C_j$ 円以上のお菓子を $D_j$ 個以上千咲ちゃんがもっていると泣きわめく。

友達が泣きわめいてしまうと千咲ちゃんはかなしいので、そうならないようにお菓子をもっていきたい。

お菓子の美味しさの合計は最大でいくつになるか求めて、千咲ちゃんを助けなさい。

入力

1 行目には、お菓子の個数 $N$ と、友達の人数 $M$ が空白区切りで与えられる。

続く $N$ 行のうち $i$ 行目には、$A_i, B_i$ が空白区切りで与えられる。

続く $M$ 行のうち $j$ 行目には、$C_j, D_j$ が空白区切りで与えられる。

出力

どの友達も泣かないように持っていくお菓子を選んだ時、その美味しさの合計としてありうる最大値を出力せよ。

制約

$N, M$ は $1$ 以上 $100 \ 000$ 以下の整数

$A_1, A_2, A_3, \dots, A_N$ は $1$ 以上 $1 \ 000 \ 000 \ 000$ 以下の整数

$B_1, B_2, B_3, \dots, B_N$ は $1$ 以上 $1 \ 000 \ 000 \ 000$ 以下の整数

$A_1 \leq A_2 \leq A_3 \leq \cdots \leq A_N$ を満たす

$C_1, C_2, C_3, \dots, C_M$ は $1$ 以上 $1 \ 000 \ 000 \ 000$ 以下の整数

$D_1, D_2, D_3, \dots, D_M$ は $1$ 以上 $1 \ 000 \ 000 \ 000$ 以下の整数

$C_1 \leq C_2 \leq C_3 \leq \cdots \leq C_M$ を満たす

入力例1

3 1
10 1
20 2
30 3
20 2

出力例1

4

$1, 3$ 番目のお菓子を持っていくと、友達を泣かせない範囲で、持ってくるお菓子の美味しさの合計を最大化することができます。

$2, 3$ 番目のお菓子両方を持っていくと、「値段が $20$ 円以上のお菓子を $2$ 個以上持ってくる」ことになるので、友達が泣きます。

入力例2

5 3
10 1
20 4
30 5
40 2
50 3
20 3
30 4
40 2

出力例2

10

$1, 2, 3$ 番目のお菓子を持っていくことによって、どの友達も泣かせない条件のもとで、持ってくるお菓子の美味しさの合計を最大化することができます。

Solution in C (judge verdict: Accepted)

//類題ABC137D
#include<stdio.h>
#define ll long long
#define min(p,q)((p)<(q)?(p):(q))

//*
//プラキュー（二分ヒープ）（最低限バージョン）
//int PQhikaku(int i,int j);//jの方が優先度が高いならtrueを返す
int PQhikaku(ll*heap,int i,int j){return heap[i]<heap[j];}
void heap_utod(ll*heap,int n){
	if(2*n>heap[0])return;
	int rflag=(2*n+1<=heap[0])&&(PQhikaku(heap,2*n,2*n+1));
	if(PQhikaku(heap,n,2*n+rflag)){
		ll temp=heap[2*n+rflag];
		heap[2*n+rflag]=heap[n];
		heap[n]=temp;
		heap_utod(heap,2*n+rflag);
	}
}
void heap_dtou(ll*heap,int n){
	if(n==1||PQhikaku(heap,n,n/2))return;
	ll temp=heap[n];
	heap[n]=heap[n/2];
	heap[n/2]=temp;
	heap_dtou(heap,n/2);
}
ll PQpop(ll*heap){
	ll rr=heap[1];
	heap[1]=heap[heap[0]--];
	heap_utod(heap,1);
	return rr;
}
void PQpush(ll*heap,ll n){
	heap[++heap[0]]=n;
	heap_dtou(heap,heap[0]);
}
//*/

ll h[100010];
ll a[100010];
ll b[100010];
ll c[100010];
ll d[100010];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)scanf("%lld%lld",a+i,b+i);
	for(int i=0;i<m;i++)scanf("%lld%lld",c+i,d+i);
	{
		int mm=2e9;
		int crr=0;
		for(int i=0;i<m;i++)if(d[i]<mm){
			c[crr]=c[i];
			d[crr]=d[i];
			mm=d[i];
			crr++;
		}
		c[crr]=2e9;
		d[crr]=1;
		crr++;
		m=crr;
	}
	
	int crr=0;
	ll ans=0;
	int limit=2e9;
	for(int i=0;i<m;i++){
		while(crr<n&&a[crr]<c[i])PQpush(h,b[crr++]);
		while(h[0]&&limit>d[i])ans+=PQpop(h),limit--;
		limit=d[i];
	}
	printf("%lld\n",ans);
}