#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,n) for ( int i=1; i<=int(n); i++ ) #define MP make_pair #define PB push_back #define SZ(x) (int((x).size())) #define ALL(x) (x).begin(), (x).end() #define X first #define Y second template inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; } template inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } typedef long long LL; typedef long double LD; typedef unsigned int uint; typedef pair pii; const int INF = 0x3f3f3f3f; LL dp[1005][15]; pii a[100005]; pii val[1005]; int main() { int n, m; while(~ scanf("%d %d", &n, &m) ) { for(int i = 1; i <= n; i ++) scanf("%d %d", &a[i].X, &a[i].Y); for(int i = 1; i <= m; i ++) scanf("%d %d", &val[i].X, &val[i].Y); memset(dp, 0x3f, sizeof(dp)); memset(dp[0], 0, sizeof(dp[0])); for(int k = 1; k <= m; k ++) for(int i = 1; i <= 1001; i ++) for(int j = 0; j <= 11; j ++) { if(val[k].Y > j) dp[i][j] = min(dp[i][j], dp[max(0, i - (val[k].Y - j))][j] + val[k].X); } LL ans = 0; for(int i = 1; i <= n; i ++) { ans += dp[a[i].X][a[i].Y]; ans = min(ans, (1LL << 60)); } if(ans >= (1LL << 60)) puts("-1"); else printf("%I64d\n", ans); } }