//by allenlyh
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <math.h>
#include <assert.h>
#include <complex>

using namespace std;

#define X first
#define Y second
#define rl real()
#define ig imge()
#define PB push_back
#define MP make_pair

#define foreach(it,s) for (__typeof(s.begin()) it = s.begin();it!=s.end();it++)
#define sign(x) (((x)<-eps)?-1:((x)>eps))

typedef long long LL;
typedef pair<double, double> point;

const int maxn = 200 + 10;
const double eps = 1e-12;
struct Tpo {
	int type;
	point c1;
};
Tpo t[maxn];
Tpo tmp[maxn];
int n, m;
int nxt[4];
int cur[4];

bool cmp(Tpo q, Tpo p) {
	return sign(q.c1.X - p.c1.X) < 0;
}

void init() {
	int minx, maxx;
	minx = maxx = 0;
	for (int i=0;i<n;i++) {
		double x, y;
		scanf("%lf%lf", &x, &y);
		tmp[i].c1.X = x;
		tmp[i].c1.Y = y;
		tmp[i].type = 0;
		if (tmp[i].c1.X < tmp[minx].c1.X) minx = i;
		if (tmp[i].c1.X > tmp[maxx].c1.X) maxx = i;
	}
	for (int i=minx;i!=maxx;i=(i+1)%n) {
		tmp[i].type = 0;
	}
	for (int i=maxx;i!=minx;i=(i+1)%n) {
		tmp[i].type = 1;
	}
	tmp[minx].type = tmp[maxx].type = 4;
	int cnt = 0;
	for (int i=minx;i!=maxx;i=(i+1)%n) t[cnt++] = tmp[i];
	for (int i=(minx+n-1)%n;i!=maxx;i=(i+n-1)%n) t[cnt++] = tmp[i];
	t[cnt++] = tmp[maxx];
	minx = maxx = 0;
	for (int i=0;i<m;i++) {
		double x, y;
		scanf("%lf%lf", &x, &y);
		tmp[i].c1.X = x;
		tmp[i].c1.Y = y;
		tmp[i].type = 0;
		if (tmp[i].c1.X < tmp[minx].c1.X) minx = i;
		if (tmp[i].c1.X > tmp[maxx].c1.X) maxx = i;
	}
	for (int i=minx;i!=maxx;i=(i+1)%m) {
		tmp[i].type = 2;
	}
	for (int i=maxx;i!=minx;i=(i+1)%m) {
		tmp[i].type = 3;
	}
	tmp[minx].type = tmp[maxx].type = 5;
	for (int i=minx;i!=maxx;i=(i+1)%m) t[cnt++] = tmp[i];
	for (int i=(minx+m-1)%m;i!=maxx;i=(i+m-1)%m) t[cnt++] = tmp[i];
	t[cnt++] = tmp[maxx];
	stable_sort(t, t + n + m, cmp);
	n += m;
}

bool updata_nxt(int i) {
	nxt[i] = cur[i] + 1;
	while (nxt[i] < n) {
		if (t[nxt[i]].type == i || t[nxt[i]].type == i / 2 + 4) break;
		nxt[i]++;
	}
	if (nxt[i] == n) return 1;
	return 0;
}

void print(int x) {
	cout<<t[x].c1.X<<' '<<t[x].c1.Y;
}

point calc(double x) {
	point ret;
	double y[4];
	for (int i=0;i<4;i++) {
		if (t[nxt[i]].c1.X != t[cur[i]].c1.X)
			y[i] = (t[nxt[i]].c1.Y - t[cur[i]].c1.Y) * (x - t[cur[i]].c1.X) / (t[nxt[i]].c1.X - t[cur[i]].c1.X) + t[cur[i]].c1.Y;
		else {
			if (i & 1) y[i] = max(t[nxt[i]].c1.Y, t[cur[i]].c1.Y);
			else y[i] = min(t[nxt[i]].c1.Y, t[cur[i]].c1.Y);
		}
	}
	ret.X = (y[1] - y[0]);
	ret.Y = (y[3] - y[2]);
	return ret;
}

double calc(double a, double b, double c, double d, double h) {
	double ret = 0;
	ret += (b + d) * h * a * 0.5;
	ret += (c - a) * h * b * 0.5;
	ret += (c - a) * (d - b) * h / 3;
	return ret;
}

void work() {
	memset(cur, -1, sizeof(cur));
	int tot = 0;
	int npos;
	for (int i=0;i<n;i++) {
		if (t[i].type == 4) {cur[0] = cur[1] = i; tot += 2; npos = i;}
		else if (t[i].type == 5) {cur[2] = cur[3] = i; tot += 2; npos = i;}
		else cur[t[i].type] = i;
		if (tot == 4) break;
	}
	if (cur[0] == -1 || cur[2] == -1) {
		puts("0.0");
		return;
	}
	for (int i=0;i<4;i++) {
		updata_nxt(i);
	}
	point c1, c2;
	c1.X = c1.Y = 0;
	double h1, h2;
	h1 = 0;
	double ans = 0;
	bool end_flag = 0;
	bool first = 1;
	for (;npos<n;npos++) {
		c2 = calc(t[npos].c1.X);
		h2 = t[npos].c1.X;
		if (!first) ans += calc(c1.X, c1.Y, c2.X, c2.Y, h2 - h1); else first = 0;
		c1 = c2;
		h1 = h2;
		if (t[npos].type == 4) {
			cur[0] = cur[1] = npos;
			end_flag |= updata_nxt(0);
			end_flag |= updata_nxt(1);
		} else if (t[npos].type == 5) {
			cur[2] = cur[3] = npos;
			end_flag |= updata_nxt(2);
			end_flag |= updata_nxt(3);
		} else {
			cur[t[npos].type] = npos;
			end_flag |= updata_nxt(t[npos].type);
		}
		if (end_flag) break;
	}
	printf("%.15lf\n", ans);
}

int main() {
	while (scanf("%d%d", &n, &m) != EOF && (n || m)) {
		init();
		work();
	}
	return 0;
}

Measured memory_bytes: 1280