#include #include #include #include #define maxa 1005 #define maxn 100005 #define maxm 1005 #define INF 2000000005 #define maxb 15 #define LL long long int using namespace std; struct query{ int a, b; query(int a, int b) : a(a), b(b){} query(){} }q[maxn]; int n, m; int cost[maxm]; int att[maxm]; int dp[maxa][maxb]; bool vis[maxa][maxb]; int def; int DP(int res, int def){ if (res <= 0) return 0; if (vis[res][def]) return dp[res][def]; vis[res][def] = 1; int& ans = dp[res][def]; ans = INF; for (int i = 1; i <= m; i++){ if (att[i] <= def) continue; ans = min(ans, DP(res - att[i] + def, def) + cost[i]); } return ans; } int main(){ while (scanf("%d%d", &n, &m) == 2){ LL ans = 0; int maxatt = 0; int maxdef = 0; for (int i = 1; i <= n; i++){ scanf("%d%d", &q[i].a, &q[i].b); maxdef = max(maxdef, q[i].b); } for (int i = 1; i <= m; i++){ scanf("%d%d", &cost[i], &att[i]); maxatt = max(maxatt, att[i]); } if (maxdef >= maxatt){ printf("-1\n"); continue; } for (int i = 1; i <= n; i++){ ans += DP(q[i].a, q[i].b); } memset(vis, 0, sizeof(vis)); printf("%I64d\n", ans); } return 0; }