#include <stdio.h>#include <memory.h>#include <iostream>#include <algorithm>#include <vector>#include <map>using namespace std;struct Node{int l,r,Lmax,Rmax,Max;int cnt;}seg[2000000];int max(int x,int y){return x > y ? x : y;}map<int,int>M;int ink[500000+5];void build(int l,int r,int idx){seg[idx].l = l;seg[idx].r = r;seg[idx].Lmax = seg[idx].Rmax = seg[idx].Max = seg[idx].cnt = 0;if(l + 1 != r){build(l,(l+r)/2,2*idx);build((l+r)/2,r,2*idx+1);}return;}void Insert(int l,int r,int idx){if(seg[idx].l == l && seg[idx].r == r){seg[idx].cnt++;return;}int mid = (seg[idx].l + seg[idx].r)/2;if(r <= mid){Insert(l,r,2*idx);}else if(l >= mid){Insert(l,r,2*idx+1);}else{Insert(l,mid,2*idx);Insert(mid,r,2*idx+1);}}int getans(int idx){if(seg[idx].l + 1 != seg[idx].r){seg[2*idx].cnt += seg[idx].cnt;seg[2*idx+1].cnt += seg[idx].cnt;int ans = max(getans(2*idx),getans(2*idx+1));ans = max(ans,seg[2*idx].Rmax + seg[2*idx+1].Lmax);seg[idx].Max = ans;seg[idx].Lmax = seg[2*idx].Lmax;seg[idx].Rmax = seg[2*idx+1].Rmax;if(ink[seg[2*idx].r]-ink[seg[2*idx].l] == seg[2*idx].Lmax){seg[idx].Lmax += seg[2*idx+1].Lmax;}if(ink[seg[2*idx+1].r]-ink[seg[2*idx+1].l] == seg[2*idx+1].Rmax){seg[idx].Rmax += seg[2*idx].Rmax;}}else{if(seg[idx].cnt == 1){seg[idx].Lmax = seg[idx].Rmax = seg[idx].Max = ink[seg[idx].r] - ink[seg[idx].l];}else{seg[idx].Lmax = seg[idx].Rmax = seg[idx].Max = 0;}}return seg[idx].Max;}vector<int>E;vector<pair<int,int> >S;int main(){int i,j,k;int L,n1,n2;while(scanf("%d%d%d",&L,&n1,&n2) != EOF){E.clear();M.clear();S.clear();if(n1 + n2 == 0){printf("0n");continue;} for(i = 1;i <= n1 + n2;i++){int a,b;scanf("%d%d",&a,&b);b++;E.push_back(a);E.push_back(b);S.push_back(make_pair(a,b));}sort(E.begin(),E.end());int idx = 0;M[E[0]] = 0;ink[0] = E[0];idx++;for(i = 1;i < E.size();i++){if(E[i] != E[i-1]){M[E[i]] = idx;ink[idx++] = E[i];}}build(0,idx-1,1);for(i = 0;i < S.size();i++){int l = M[S[i].first],r = M[S[i].second];Insert(l,r,1);}printf("%dn",getans(1));}return 0;}


