#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define LOCAL #define ll long long #define maxn 100005 #define maxm 4000 #define maxv 4000 #define INF 100000000 using namespace std; int n, m; ll V; ll k[maxm], p[maxm]; ll d[maxv][12]; void dp(int define) { for(int v = 1; v <= V; v++) d[v][define] = INF; d[0][define] = 0; int failed = 1; for(int i = 0; i < m; i++) { if(p[i] <= define) continue; failed = 0; for(int v = p[i]-define; v <= V; v++) { if(d[v-(p[i]-define)][define] != INF) d[v][define] = min(d[v][define], d[v-(p[i]-define)][define] + k[i]); } } if(failed) { for(int i = 0; i <= V; i++) d[i][define] = -1; } else { for(int i = V-1; i >= 0; i--) d[i][define] = min(d[i][define], d[i+1][define]); } } ll a[maxn], b[maxn]; int main() { #ifdef LOCAL freopen("data.in.txt", "r", stdin); freopen("data.out.txt", "w", stdout); #endif while(scanf("%d%d", &n, &m) == 2 && n) { V = 0; ll maxb = 0; for(int i = 0; i < n; i++) scanf("%lld%lld", &a[i], &b[i]), V = max(V, a[i]), maxb = max(maxb, b[i]); for(int i = 0; i < m; i++) scanf("%lld%lld", &k[i], &p[i]), V = max(V, p[i]); V *= 2; for(int i = 0; i <= maxb; i++) dp(i); ll ans = 0; for(int i = 0; i < n; i++) { if(d[a[i]][b[i]] == -1) { ans = -1; break; } ans += d[a[i]][b[i]]; } printf("%lld\n", ans); } return 0; }