#include<bits/stdc++.h>
using namespace std;
int n,m1,m2;
inline int read()
{
char ch=getchar();
int f=1,s=0;
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
s=(s<<3)+(s<<1)+(ch^48);
ch=getchar();
}
return f*s;
}
struct node{
int reach,leave;
}national[100010],international[100010];
inline bool cmp(node x,node y)
{
return x.reach<y.reach;
}
void check(queue<int>& q,int& arrive)
{
queue<int>p;
while(!q.empty())
{
if(arrive<q.front())
q.push(p.front());
q.pop();
}
q=p;
}
int inter(int number)
{
queue<int>q;
int ans=0;
for(int i=1;i<=m2;++i)
{
check(q,international[i].leave);
if(q.size()<number)
{
q.push(international[i].leave);
++ans;
}
}
return ans;
}
int nation(int number)
{
queue<int>q;
int ans=0;
for(int i=1;i<=m1;++i)
{
if(i==0)
int j=0;
check(q,national[i].leave);
if(q.size()<number)
{
q.push(national[i].leave);
++ans;
}
}
return ans;
}
int main()
{
n=read(),m1=read(),m2=read();
for(int i=1;i<=m1;++i)
national[i].reach=read(),national[i].leave=read();
for(int i=1;i<=m2;++i)
international[i].reach=read(),international[i].leave=read();
sort(national+1,national+m1+1,cmp);
sort(international+1,international+m2+1,cmp);
int maxx=-1;
for(int i=0;i<=n;++i)
maxx=max(maxx,inter(i)+nation(n-i));
printf("%d\n",maxx);
return 0;
}
/*
3 5 4
1 5
3 8
6 10
9 14
13 18
2 11
4 15
7 17
12 16
*/