#include #include #include #include #include #include #include using namespace std; typedef long long ll; #define mem(a,b) memset(a,b,sizeof(a)) const int M=1e3+100; const int K=15; const ll INF=1e16; int cnt[K][M]; int val[M],p[M],t[M]; ll dp[M][M<<1]; bool vis[K]; bool solve(){ mem(cnt,0),mem(vis,0); int n,m; if(scanf("%d%d",&n,&m)==-1) return 0; int maxb=0,maxp=0; for(int i=1;i<=n;i++){ int a,b; scanf("%d%d",&a,&b); cnt[b][a]++; vis[b]=1,maxb=max(maxb,b); } for(int i=1;i<=m;i++){ scanf("%d%d",val+i,p+i); maxp=max(maxp,p[i]); } if(maxb>=maxp){ printf("-1\n"); return 1; } ll ans=0; for(int i=0;i<=10;i++){ if(!vis[i]) continue; for(int j=1;j<=m;j++) t[j]=p[j]-i; int curmax=1000; while(curmax && !cnt[i][curmax]) curmax--; curmax+=1005; for(int j=1;j<=curmax;j++) dp[0][j]=INF; dp[0][0]=0; for(int j=1;j<=m;j++){ for(int k=0;k<=curmax;k++) dp[j][k]=dp[j-1][k]; if(t[j]<=0) continue; for(int k=0;k<=t[j]-1;k++) dp[j][k]=min(dp[j][k],1LL*val[j]); for(int k=t[j];k<=curmax;k++){ dp[j][k]=min(dp[j][k],dp[j][k-t[j]]+val[j]); } } for(int j=curmax-1;j>=1;j--) dp[m][j]=min(dp[m][j],dp[m][j+1]); for(int j=1;j<=1000;j++){ if(cnt[i][j]==0) continue; ans+=1LL*cnt[i][j]*dp[m][j]; } // cerr<