#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <utility>

using namespace std;
typedef long long ll;
const double EPS = 1e-12;

struct Point{
  double x,y;
  Point(double x = 0.0, double y = 0.0): x(x), y(y) {}
  Point operator + (Point p){
    return Point(x + p.x,y + p.y);
  }
  Point operator - (Point p){
    return Point(x - p.x,y - p.y);
  }
  Point operator * (double lambda){
    return Point(x * lambda,y * lambda);
  }
  Point operator / (double lambda){
    return Point(x / lambda,y / lambda);
  }
  double norm(){
    return x * x + y * y;
  }
  double abs_(){
    return sqrt(norm());
  }
  bool operator == (const Point &p)const
  {
    return abs(x - p.x) < EPS && abs(y - p.y) < EPS;
  }
  bool operator < (const Point &p)const{
    if(abs(x - p.x) < EPS) return y < p.y;
    return x < p.x;
  }
};
typedef Point Vector;
double dot(Vector a,Vector b){
  return a.x * b.x + a.y * b.y;
}
double det(Vector a,Vector b){
  return a.x * b.y - a.y * b.x;
}
struct Segment{
  Point p1,p2;
  Segment(Point p1 = Point(),Point p2 = Point()): p1(p1), p2(p2) {}
};
typedef Segment Line;
typedef vector <Point> Polygon;
#define maxn 105
Point crossPoint(Line a,Line b){
  double r = det(b.p2 - b.p1,a.p1 - b.p1) / det(a.p2 - a.p1,b.p2 - b.p1);
  return a.p1 + (a.p2 - a.p1) * r;
}
double calc(Polygon P,double x0){
  double miny = 101.0, maxy = -101.0;
  int n = P.size();
  Line l = Line(Point(x0,-101.0),Point(x0,101.0));
  for(int i = 0;i < n;i++){
    if(P[i].x == P[(i + 1) % n].x) continue;
    if((P[i].x - x0) * (P[(i + 1) % n].x - x0) <= 0.0){
      Point p = crossPoint(Line(P[i],P[(i + 1) % n]),l);
      miny = min(miny,p.y);
      maxy = max(maxy,p.y);
    }
  }
  return max(0.0,maxy - miny);
}
int m,n;
Polygon c1,c2;
vector <double> xs;
double f(double x0){
  return calc(c1,x0) * calc(c2,x0);
}
int main(){
  while(~scanf("%d%d",&m,&n) && m){
    xs.clear();
    c1.resize(m);
    c2.resize(n);
    for(int i = 0;i < m;i++){
      double x,y;
      scanf("%lf%lf",&x,&y);
      c1[i] = Point(x,y);
      xs.push_back(x);
    }
    for(int i = 0;i < n;i++){
      double x,y;
      scanf("%lf%lf",&x,&y);
      c2[i] = Point(x,y);
      xs.push_back(x);
    }
    sort(xs.begin(),xs.end());
    double ans = 0.0;
    for(int i = 0;i < n + m - 1;i++){
      double l = xs[i] + EPS, r = xs[i + 1] - EPS, mid = (l + r) / 2.0;
      ans += (r - l) * (f(l) + 4.0 * f(mid) + f(r)) / 6.0;
    }
    printf("%.10f\n",ans);
  }
  return 0;
}

