#include<iostream>
#include<cmath>
#include<map>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
struct node{
int jq,cq;
}gnfj[100010],gjfj[10010];
int lqsum[100010],lqfj[100010];
int jlqsum[100010],jlqfj[100010];
int n,m1,m2;
bool cmp(node a,node b){
return a.jq<b.jq;
}
int main(){
cin >>n>>m1>>m2;
for(int i=1;i<=m1;i++){
cin >>gnfj[i].jq>>gnfj[i].cq;
}
for(int i=1;i<=m2;i++){
cin >>gjfj[i].jq>>gjfj[i].cq;
}
sort(gjfj+1,gjfj+m2+1,cmp);
sort(gnfj+1,gnfj+m1+1,cmp);
int cnt=1;
lqsum[1]=1;
lqfj[1]=gnfj[1].cq;
for(int i=2;i<=m1;i++){
int minn=0x7fffffff,minj;
for(int j=1;j<=cnt;j++){
if(lqfj[j]<minn&&gnfj[i].jq>minn){
minn=lqfj[j];
minj=j;
}
}
if(minn==0x7fffffff){
cnt++;
lqfj[cnt]=gnfj[i].cq;
lqsum[cnt]++;
}else{
lqfj[minj]=gnfj[i].cq;
lqsum[minj]++;
}
}
jlqsum[1]=1;
cnt=1;
jlqfj[1]=gjfj[1].cq;
for(int i=2;i<=m2;i++){
int minn=0x7fffffff,minj;
for(int j=1;j<=cnt;j++){
if(jlqfj[j]<minn&&gjfj[i].jq>minn){
minn=jlqfj[j];
minj=j;
}
}
if(minn==0x7fffffff){
cnt++;
jlqfj[cnt]=gjfj[i].cq;
jlqsum[cnt]++;
}else{
jlqfj[minj]=gjfj[i].cq;
jlqsum[minj]++;
}
}
int gnn[100010],gjj[100010];
for(int i=1;i<=n;i++){
gnn[i]+=gnn[i-1]+lqsum[i];
}
for(int i=1;i<=n;i++){
gjj[i]+=gjj[i-1]+jlqsum[i];
}
int maxx=-1;
for(int i=1;i<=n;i++){
maxx=max(maxx,gnn[i]+gjj[n-i]);
}
cout <<maxx;
return 0;
}