1 #include <bits/stdc++.h>
2 #define INF 0x3f3f3f3f
3 using namespace std;
4 struct Node{
5 int a,b;
6 }node[100005];
7 struct Mod{
8 int k,p;
9 }mod[1005];
10 int dp[1005][15];
11 int main(){
12 int n,m;
13 while(~scanf("%d%d",&n,&m)){
14 int le=0,lm=0;
15 for(int i=1;i<=n;i++){
16 scanf("%d%d",&node[i].a,&node[i].b);//a表示生命,b表示防御
17 le=max(le,node[i].b);
18 }
19
20 for(int i=1;i<=m;i++){
21 scanf("%d%d",&mod[i].k,&mod[i].p);//k表示消耗晶石数,p表示伤害
22 lm=max(lm,mod[i].p);
23 }
24
25 if(le>=lm){
26 cout<<"-1"<<endl;
27 continue;
28 }
29 memset(dp,INF,sizeof(dp));
30 for(int j=0;j<15;j++)
31 dp[0][j]=0;
32 for(int i=0;i<=10;i++){//打表出所有可能的情况
33 for(int j=1;j<=1000;j++){
34 for(int u=1;u<=m;u++){
35 int dam=mod[u].p-i;
36 if(dam<=0)
37 continue;
38 if(dam>=j){
39 dp[j][i]=min(dp[j][i],mod[u].k);
40 }else{
41 dp[j][i]=min(dp[j][i],dp[j-dam][i]+mod[u].k);
42 }
43 }
44 }
45 }
46 long long int sum=0;
47 for(int i=1;i<=n;i++){//将所有出现的情况累加
48 sum+=dp[node[i].a][node[i].b];
49 }
50 cout<<sum<<endl;
51 }
52 return 0;
53 }