#include "stdio.h"
#include "string.h"
#include "queue"
#include "iostream"
#include "functional"
#include "map"
#include "algorithm"
using namespace std;
const int maxn = 100005;
const int mod = 1000000007 ;
const int inf = 1<<30;
typedef __int64 LL;
int n,m;
map<int,int>M;
struct node
{
int t,l;
}task[maxn],mac[maxn];
bool cmp( node a,node b )
{
if( a.t == b.t )
return a.l > b.l;
return a.t > b.t;
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("data.txt","r",stdin);
#endif
int t,l;
while( scanf("%d%d",&n,&m) != EOF )
{
int ans = 0;
LL val = 0;
for( int i = 1; i <= n; i ++ )
scanf("%d%d",&mac[i].t,&mac[i].l);
for( int i = 1; i <= m; i ++ )
scanf("%d%d",&task[i].t,&task[i].l);
sort( mac+1,mac+n+1,cmp );
sort( task+1,task+m+1,cmp );
M.clear();
int k = 1;
for( int i = 1; i <= m; i ++ )
{
while( k <= n && mac[k].t >= task[i].t )
{
M[mac[k].l] ++;
k ++;
}
map<int,int>::iterator it = M.lower_bound( task[i].l );
if( it != M.end() )
{
ans ++;
val += task[i].t * 500 + task[i].l * 2;
int t = it->first;
M[t]--;
if( M[t] == 0 ) M.erase( t );
}
}
printf("%d %I64d\n",ans,val);
}
return 0;
}