#include #include #include #include #include #include using namespace std; void solve (int , int [], int [], int [][1010]); int main () { int n, m, i; int dp[20][1010]; int a[100010], b[100010]; int k[1010], p[1010]; while (~scanf ("%d%d", &n, &m)) { for (i = 1; i <= n; i++) { scanf ("%d%d", &a[i], &b[i]); } for (i = 1; i <= m; i++) { scanf ("%d%d", &k[i], &p[i]); } memset (dp, -1, sizeof(dp)); solve (m, k, p, dp); long long sum = 0; for (i = 0; i <= n; i++) { if (dp[b[i]][a[i]] == -1) { sum = -1; break; } sum += dp[b[i]][a[i]]; } printf ("%lld\n", sum); } return 0; } void solve (int m, int k[], int p[], int dp[][1010]) { int i, j, s, harm; for (i = 0; i <= 10; i++) { dp[i][0] = 0; } for (i = 0; i <= 10; i++) { for (j = 1; j <= 1000; j++) { for (s = 1; s <= m; s++) { harm = p[s] - i; if (harm <= 0) { continue; } if (harm >= j) { if (k[s] < dp[i][j] || dp[i][j] == -1) { dp[i][j] = k[s]; } } else { if (k[s] + dp[i][j - harm] < dp[i][j] || dp[i][j] == -1) { dp[i][j] = k[s] + dp[i][j - harm]; } } } } } }