// [7/23/2014 Sjm]/*又坑在TLE上了。。。。Each machine can only complete a task one day. Each task can only be completed by one machine.所以想到了贪心。。。发现 dollars = 500*xi+2*yi, 由于 xi(0<xi<1440),yi(0=<yi<=100), 500*1 > 2*100,所以 dollars 的决定因素是需要的时间,那么就尽可能先解决需要时间多的任务,同时选择的时间和难度水平尽可能接近任务的机器,如此即可求得最优解。不过,先前写的代码一直TLE,后来用 Judge[101][1441] 做一个预处理,AC。。。。*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef __int64 int64;
const int MAX = 100005;
int N, M, len;
struct node {
int time;
int lev;
};
bool Cmp(const node n1, const node n2) {
if (n1.time == n2.time) {
return n1.lev > n2.lev;
}
else {
return n1.time > n2.time;
}
}
node task[MAX];
int Judge[101][1441];
void Solve()
{
int num = 0;
int64 money = 0;
for (int i = 0; i < M; ++i) {
for (int j = task[i].lev; j <= 100; ++j) {
int k;
for (k = task[i].time; k <= 1440; ++k) {
if (Judge[j][k]) {
Judge[j][k]--;
num++;
money += (500 * task[i].time + 2 * task[i].lev);
break;
}
}
if (k != 1441) {
break;
}
}
}
printf("%d %I64d\n", num, money);
}
int main()
{
//freopen("input.txt", "r", stdin);
while (~scanf("%d %d", &N, &M)) {
memset(Judge, 0, sizeof(Judge));
int x, y;
for (int i = 0; i < N; ++i) {
scanf("%d %d", &x, &y);
Judge[y][x]++;
}
for (int i = 0; i < M; ++i) {
scanf("%d %d", &task[i].time, &task[i].lev);
}
sort(task, task + M, Cmp);
Solve();
}
return 0;
}