#include #include using namespace std; #define MAX 1000000000+1 struct monster { int a; int b; } MO[100005]; struct jn { int k; int p; } JN[2010]; int f[2010][15]; int main() { //freopen("in.txt", "r", stdin); int n, m; while (cin >> n >> m) { for (int i = 1; i <= n; i++) { scanf("%d%d", &MO[i].a, &MO[i].b); } for (int i = 0; i < m; i++) { scanf("%d%d", &JN[i].k, &JN[i].p); } long long ans = 0; //memset(f,INF,sizeof(f)); for (int fangyu = 0; fangyu <= 10; fangyu++) { f[0][fangyu] = 0; for (int i = 1; i <= 2000; i++) { f[i][fangyu] = MAX; } } int flag; for (int i = 0; i < m; i++) for (int fangyu = 0; fangyu <= 10; fangyu++) { flag = 1; for (int j = JN[i].p - fangyu; j <=2000; j++) { if (JN[i].p > fangyu) f[j][fangyu] = f[j][fangyu] < f[j - (JN[i].p - fangyu)][fangyu] + JN[i].k ? f[j][fangyu] : f[j - (JN[i].p - fangyu)][fangyu] + JN[i].k; else { flag = 0; break; } } if (flag == 0) break; } for (int fangyu = 0; fangyu <= 10; fangyu++) for (int i = 1999; i >= 1; i--) { f[i][fangyu] =min( f[i][fangyu], f[i+1][fangyu]); } for (int i = 1; i <= n; i++) { int temp = f[MO[i].a][MO[i].b]; if (temp == MAX) { ans = -1; break; } else { ans += temp; } } cout << ans << endl; } return 0; }