#include using namespace std; const int MAXN = 1e5+7; const long long inf = 1e18; typedef long long LL; int n,m; int a[MAXN],b[MAXN]; int p[1005],k[1005]; struct node { int v,w; } wupin[11][1005]; LL dp[11][2005]; LL ans[11][2005]; int main() { while(~scanf("%d%d",&n,&m)) { for(int i = 0; i < n; ++i)scanf("%d%d",&a[i],&b[i]); for(int i = 0; i < m; ++i)scanf("%d%d",&k[i],&p[i]); //预处理物品 for(int i = 0; i <= 10; ++i) for(int j = 0; j < m; ++j)wupin[i][j].w = -k[j],wupin[i][j].v = p[j] - i; //完全背包 for(int i = 0; i <= 10; ++i) { for(int j = 0; j <= 2000; ++j)dp[i][j] = -inf; dp[i][0] = 0; } for(int i = 0; i <= 10; ++i) for(int j = 0; j < m; ++j)if(wupin[i][j].v>0) for(int f = wupin[i][j].v; f <= 2000; ++f) { dp[i][f] = max(dp[i][f],dp[i][f-wupin[i][j].v] + wupin[i][j].w); } for(int i = 0; i <= 10; ++i) { LL MAX = -inf; for(int j = 2000; j >= 0; --j) { if(dp[i][j] > MAX)MAX = dp[i][j]; ans[i][j] = MAX; } } //处理怪物 LL sum = 0; for(int i = 0; i < n; ++i) { if(ans[b[i]][a[i]] == -inf) { sum = -1; break; } else sum += -ans[b[i]][a[i]]; } printf("%I64d\n",sum); } return 0; } /* 1 2 1000 5 100000 6 100000 1000 */