#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;++i)
#define mp make_pair
#define pb push_back
#define x0 gtmsub
#define y0 gtmshb
#define x1 gtmjtjl
#define y1 gtmsf
#define N 4005
#define M 10000007
#define inf 2147483647
struct seg{int l,r;}a[N],b[N];
int n,m,S,T;
struct EDGE { int adj, w, next; } edge[M];
int top, gh[N], nrl[N];
void addedge(int x, int y, int w) {
    edge[++top].adj = y;
    edge[top].w = w;
    edge[top].next = gh[x];
    gh[x] = top;
    edge[++top].adj = x;
    edge[top].w = 0;
    edge[top].next = gh[y];
    gh[y] = top;
}
int dist[N], q[N];
int bfs() {
    memset(dist, 0, sizeof(dist));
    q[1] = S; int head = 0, tail = 1; dist[S] = 1;
    while (head != tail) {
        int x = q[++head];
        for (int p=gh[x]; p; p=edge[p].next)
            if (edge[p].w && !dist[edge[p].adj]) {
                dist[edge[p].adj] = dist[x] + 1;
                q[++tail] = edge[p].adj;
            }
    }
    return dist[T];
}
int dinic(int x, int delta) {
    if (x==T) return delta;
    for (int& p=nrl[x]; p && delta; p=edge[p].next)
        if (edge[p].w && dist[x]+1 == dist[edge[p].adj]) {
            int dd = dinic(edge[p].adj, min(delta, edge[p].w));
            if (!dd) continue;
            edge[p].w -= dd;
            edge[p^1].w += dd;
            return dd;
        }
    return 0;
}
int work() {
    int ans = 0;
    while (bfs()) {
        memcpy(nrl, gh, sizeof(gh));
        int t; while (t = dinic(S, inf)) ans += t;
    }
    return ans;
}
priority_queue<int,vector<int>,greater<int>>Q;
bool cmp(seg x,seg y){return x.l<y.l;}
int solmax(){
	int ans=0;
	sort(a+1,a+n+1,cmp);sort(b+1,b+m+1,cmp);
	int topa=1,topb=1;
	rep(i,400){
		while(topa<=n&&a[topa].l==i)Q.push(a[topa++].r);
		while(topb<=m&&b[topb].l==i)Q.push(b[topb++].r);
		while(Q.size()&&Q.top()<i)Q.pop();
		if(Q.size())Q.pop(),++ans;
	}
	return ans;
}
int solmin(){
	S=2005,T=2006;
	rep(i,n)addedge(S,800+i,1);
	rep(i,m)addedge(800+n+i,T,1);
	rep(i,400)addedge(i,i+400,1);
	rep(i,n)for(int j=a[i].l;j<=a[i].r;++j)addedge(800+i,j,1);
	rep(i,m)for(int j=b[i].l;j<=b[i].r;++j)addedge(400+j,800+n+i,1);
	return work();
}
int main(){	
	scanf("%d%d",&n,&m);
	m=n-m,n=n-m;
	rep(i,n)scanf("%d%d",&a[i].l,&a[i].r);
	rep(i,m)scanf("%d%d",&b[i].l,&b[i].r);
	printf("%d\n%d\n",solmax(),solmin());
	return 0;
}
