#include using namespace std; typedef long long LL; inline LL read(){ char ch = getchar(); LL x = 0, op = 1; while (ch < '0' || '9' < ch) { if (ch == '-') op = -1; ch = getchar(); } while ('0' <= ch && ch <= '9') { x = x*10 + ch-'0'; ch = getchar(); } return op * x; } LL f[2005][12], w[1005], cost[1005]; LL n, m, a[100005], b[100005], A, B, best; LL ans; int main() { while (~scanf("%I64d%I64d", &n, &m)) { A = B = ans = best = 0; memset(f, 0x3f, sizeof f); for (LL i=1; i<=n; i++) { a[i] = read(); b[i] = read(); A = max(A, a[i]); B = max(B, b[i]); } for (LL i=1; i<=m; i++) { cost[i] = read(); w[i] = read(); best = max(best, w[i]); } if (best <= B) { puts("-1"); continue; } for (LL t=0; t<=B; t++) { f[0][t] = 0; for (LL i=0; i<=A+1000; i++) { if (f[i][t] >= 1e18) continue; for (LL j=1; j<=m; j++) if (w[j] > t && i+w[j]-t <= A+1000) f[i+w[j]-t][t] = min(f[i+w[j]-t][t], f[i][t] + cost[j]); } for (LL i=A+1000; i>=0; i--) f[i][t] = min(f[i][t], f[i+1][t]); } for (LL i=1; i<=n; i++) { if (f[a[i]][b[i]] >= 1e18) { ans = -1; break; } ans += f[a[i]][b[i]]; } printf("%I64d\n", ans); } return 0; }