#include <bits/stdc++.h>
using namespace std;
class Point {
 public:
  double x, y;
  Point(double x = 0, double y = 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 k) { return Point(x * k, y * k); }
  Point operator/(double k) { return Point(x / k, y / k); }
  bool operator<(Point p) const { return (x != p.x ? x < p.x : y < p.y); }
  bool operator==(Point p) const {
    return fabs(x - p.x) < (1e-11) && fabs(y - p.y) < (1e-11);
  }
  double abs() { return sqrt(norm()); }
  double norm() { return (x * x + y * y); }
};
class Segment {
 public:
  Point p1, p2;
  Segment(Point p1, Point p2) : p1(p1), p2(p2) {}
};
double norm(Point a) { return (a.x * a.x + a.y * a.y); }
double abs(Point a) { return sqrt(norm(a)); }
double dot(Point a, Point b) { return (a.x * b.x + a.y * b.y); }
double cross(Point a, Point b) { return (a.x * b.y - a.y * b.x); }
Point median_Point(Point a, Point b) {
  Point v = a - b;
  return b + (v / 2);
}
static const int COUNTER_CLOCKWISE = 1;
static const int CLOCKWISE = -1;
static const int ONLINE_BACK = 2;
static const int ONLINE_FRONT = -2;
static const int ON_SEGMENT = 0;
int ccw(Point p0, Point p1, Point p2) {
  Point a = p1 - p0;
  Point b = p2 - p0;
  if (cross(a, b) > (1e-11)) return COUNTER_CLOCKWISE;
  if (cross(a, b) < -(1e-11)) return CLOCKWISE;
  if (dot(a, b) < -(1e-11)) return ONLINE_BACK;
  if (a.norm() < b.norm()) return ONLINE_FRONT;
  return ON_SEGMENT;
}
Point PointRotation(Point base, Point a, double r) {
  Point b = a - base;
  a.x = b.x * cos((r / 180) * M_PI) - b.y * sin((r / 180) * M_PI);
  a.y = b.x * sin((r / 180) * M_PI) + b.y * cos((r / 180) * M_PI);
  a = a + base;
  return a;
}
Segment getPerpendicularBisector(Segment S) {
  Point p1 = median_Point(S.p1, S.p2);
  Point p2 = PointRotation(p1, S.p1, 90);
  Point p3 = PointRotation(p1, S.p1, 270);
  return Segment(p2, p3);
}
Point getCrossPointLL(Segment a, Segment b) {
  double A = cross(a.p2 - a.p1, b.p2 - b.p1);
  double B = cross(a.p2 - a.p1, a.p2 - b.p1);
  if (abs(A) < (1e-11) && abs(B) < (1e-11)) return b.p1;
  return b.p1 + (b.p2 - b.p1) * (B / A);
}
double getPolygonArea(vector<Point> p) {
  double area = 0.0;
  int n = p.size();
  for (int i = 0; i < n; i++) area += cross(p[i % n], p[(i + 1) % n]);
  return area / 2;
}
vector<Point> convex_cut(vector<Point> p, Segment l) {
  vector<Point> ans;
  for (int i = 0; i < p.size(); i++) {
    Point A = p[i], B = p[(i + 1) % p.size()];
    if (ccw(l.p1, l.p2, A) != -1) ans.push_back(A);
    if (ccw(l.p1, l.p2, A) * ccw(l.p1, l.p2, B) < 0)
      ans.push_back(getCrossPointLL(l, Segment(A, B)));
  }
  return ans;
}
int main() {
  int n, m;
  vector<Point> P;
  vector<Point> vp;
  while (1) {
    cin >> n >> m;
    if (n + m == 0) break;
    P.clear();
    vp.clear();
    P.resize(n);
    vp.resize(m);
    for (int i = 0; i < n; i++) cin >> P[i].x >> P[i].y;
    for (int i = 0; i < m; i++) cin >> vp[i].x >> vp[i].y;
    for (int i = 0; i < m; i++) {
      double ans = 1000000000;
      for (int j = 0; j < m; j++) {
        for (int k = 0; k < m; k++) {
          if (i == j || i == k || j == k) continue;
          vector<Point> v = P;
          Segment L1 = getPerpendicularBisector(Segment(vp[i], vp[j % m]));
          v = convex_cut(v, L1);
          Segment L2 = getPerpendicularBisector(Segment(vp[i], vp[k % m]));
          v = convex_cut(v, L2);
          ans = min(getPolygonArea(v), ans);
        }
      }
      printf("%.10f\n", ans);
    }
  }
  return 0;
}
