#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <ctime>
#include <queue>
#include <stack>
#include <algorithm>
#include <list>
#include <vector>
#include <set>
#include <map>
#include <iostream>
#include <deque>
#include <complex>
#include <string>
#include <iomanip>
#include <sstream>
#include <bitset>
#include <valarray>
#include <iterator>
using namespace std;
typedef long long int lli;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;

#define REP(i,x) for(int i=0;i<(int)(x);i++)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RREP(i,x) for(int i=(x);i>=0;i--)
#define RFOR(i,c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)
#define ALL(container) container.begin(), container.end()
#define SZ(container) ((int)container.size())

const int INF = 1<<30;
int LIS(vector<int> v){
	vector<int> dp(v.size(), INF);
	REP(i, v.size()) *lower_bound(dp.begin(), dp.end(), v[i]) = v[i]; // upper_bound にするとstrict increaseではない部分列
	return lower_bound(dp.begin(), dp.end(), INF) - dp.begin(); // ここはlower_boundのままにする
}

int n, m;

main(){
	while(cin >> n, n){
		vector<pii> x;
		REP(i, n){
			int h, r;
			cin >> h >> r;
			x.push_back(pii(h, -r));
		}
		cin >> n;
		REP(i, n){
			int h, r;
			cin >> h >> r;
			x.push_back(pii(h, -r));
		}
		sort(ALL(x));
		vector<int> lis;
		REP(i, x.size()) lis.push_back(-x[i].second);
		cout << LIS(lis) << endl;
	}
	return 0;
}