rt
#include<bits/stdc++.h>
#define iter set<node>::iterator
using namespace std;
inline int read()
{
int d=0,f=0;
char c=getchar();
while(!isdigit(c))
f|=c=='-',c=getchar();
while(isdigit(c))
d=d*10+(c^48),c=getchar();
return f?-d:d;
}
const int maxn=1e5+5;
struct node
{
int l,r;
bool operator<(node s1)const
{
return l<s1.l;
}
}a[maxn],b[maxn];
set<node> q,p;
int f1[maxn],f2[maxn],n,m1,m2;
int main()
{
freopen("airport.in","r",stdin);
freopen("airport.out","w",stdout);
cin>>n>>m1>>m2;
for(int i=1;i<=m1;i++)
{
cin>>a[i].l>>a[i].r;
q.insert(a[i]);
}
for(int i=1;i<=m2;i++)
{
cin>>b[i].l>>b[i].r;
p.insert(b[i]);
}
int tot=0;
for(iter i=q.begin();i!=q.end();i++)
{
int tp=1;
iter it=q.lower_bound((node){i->r,0});
while(it!=q.end())
{
int t=it->r;
q.erase(it);
it=q.lower_bound((node){t,0});
++tp;
}
// cout<<tp<<endl;
++tot;
f1[tot]=f1[tot-1]+tp;
}
int cnt=0;
for(iter i=p.begin();i!=p.end();i++)
{
int tp=1;
iter it=p.lower_bound((node){i->r,0});
while(it!=p.end())
{
++tp;
int t=it->r;
p.erase(it);
it=p.lower_bound((node){t,0});
}
++cnt;
f2[cnt]=f2[cnt-1]+tp;
}
for(int i=1;i<=n;i++)
{
f1[i]=max(f1[i],f1[i-1]);
f2[i]=max(f2[i],f2[i-1]);
// cerr<<f1[i]<<' '<<f2[i]<<endl;
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,f1[i]+f2[n-i]);
}
cout<<ans;
return 0;
}