#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LL long long using namespace std; const int M = 1e3 + 5, mod = 1e9 + 7, MOD = 1e9 + 7; const LL INF = 1e18; const double PI = acos(-1); vectorB[11]; struct node { int k, p; void read() { scanf("%d%d", &k, &p); } } A[M]; int main() { int n, m; while(scanf("%d%d", &n, &m) != EOF) { for(int j = 0; j <= 10; j++) B[j].clear(); for(int j = 1; j <= n; j++) { int a, b; scanf("%d%d", &a, &b); B[b].push_back(a); } for(int j = 1; j <= m; j++) { A[j].read(); } LL ans = 0; int ok = 1; for(int j = 0; j <= 10; j++) { if(!B[j].size()) continue; int maxx = 0; for(auto x : B[j]) { maxx = max(maxx, x); } vectordp(maxx + 1, INF); dp[0] = 0; for(int k = 1; k <= m; k++) { if(A[k].p <= j) continue; for(int i = 0; i <= maxx; i++) { dp[min(maxx, i + A[k].p - j)] = min(dp[min(maxx, i + A[k].p - j)], dp[i] + A[k].k); } } for(int i = maxx - 1; i >= 0; i--) { dp[i] = min(dp[i], dp[i + 1]); } for(auto x : B[j]) { if(dp[x] == INF) ok = 0; ans += dp[x]; } } if(!ok) ans = -1; printf("%I64d\n", ans); } return 0; }