#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-8, pi = acos(-1.0);
namespace std {
bool operator<(const complex<long double> &lhs,
               const complex<long double> &rhs) {
  return lhs.real() == rhs.real() ? lhs.imag() < rhs.imag()
                                  : lhs.real() < rhs.real();
}
}  // namespace std
long double dot(complex<long double> a, complex<long double> b) {
  return real(conj(a) * b);
}
long double cross(complex<long double> a, complex<long double> b) {
  return imag(conj(a) * b);
}
struct L {
  complex<long double> a, b;
};
int ccw(complex<long double> a, complex<long double> b,
        complex<long double> c) {
  b -= a;
  c -= a;
  if (cross(b, c) > eps) return 1;
  if (cross(b, c) < -eps) return -1;
  if (dot(b, c) < 0) return 2;
  if (norm(b) < norm(c)) return -2;
  return 0;
}
bool isis_ls(L l, L s) {
  long double a = cross(l.b - l.a, s.a - l.a);
  long double b = cross(l.b - l.a, s.b - l.a);
  return (a * b < eps);
}
complex<long double> is_ll(L s, L t) {
  complex<long double> sv = s.b - s.a, tv = t.b - t.a;
  return s.a + sv * cross(tv, t.a - s.a) / cross(tv, sv);
}
long double area(const vector<complex<long double>> &p) {
  long double res = 0;
  int n = p.size();
  for (int j = (0); j < (int)(n); ++j) res += cross(p[j], p[(j + 1) % n]);
  return res / 2;
}
int is_in_Polygon(const vector<complex<long double>> &g,
                  complex<long double> p) {
  bool in = false;
  int n = g.size();
  for (int i = 0; i < n; i++) {
    complex<long double> a = g[i] - p, b = g[(i + 1) % n] - p;
    if (imag(a) > imag(b)) swap(a, b);
    if (imag(a) <= 0 && 0 < imag(b))
      if (cross(a, b) < 0) in = !in;
    if (abs(cross(a, b)) < eps && dot(a, b) < eps) return 0;
  }
  if (in) return 1;
  return -1;
}
int main() {
  while (1) {
    int n, m;
    cin >> n >> m;
    if (!n) break;
    vector<complex<long double>> pl, vp;
    for (int i = (0); i < (int)(n); ++i) {
      int x, y;
      cin >> x >> y;
      pl.emplace_back(x, y);
    }
    for (int i = (0); i < (int)(m); ++i) {
      int x, y;
      cin >> x >> y;
      vp.emplace_back(x, y);
    }
    for (int i = (0); i < (int)(m); ++i) {
      vector<complex<long double>> poly = pl;
      for (int j = (0); j < (int)(m); ++j) {
        if (j == i) continue;
        complex<long double> pc = (vp[i] + vp[j]) / long double(2.0);
        complex<long double> ig(0, 1);
        L l1 = {pc, (vp[j] - pc) * ig + pc};
        vector<pair<int, complex<long double>>> is;
        for (int k = (0); k < (int)(poly.size()); ++k) {
          L l2 = {poly[k], poly[(k + 1) % poly.size()]};
          if (isis_ls(l1, l2)) {
            is.emplace_back(k, is_ll(l1, l2));
          }
        }
        sort(begin(is), end(is));
        do {
          int k;
          complex<long double> p;
          tie(k, p) = is[0];
          int l;
          complex<long double> q;
          tie(l, q) = is[1];
          if (l < k) l += poly.size();
          vector<complex<long double>> np;
          np.push_back(p);
          for (int a = (k + 1); a < (int)(l + 1); ++a) {
            np.push_back(poly[a % poly.size()]);
          }
          np.push_back(q);
          if (is_in_Polygon(np, vp[i]) > 0) {
            poly = np;
            break;
          }
        } while (next_permutation(begin(is), end(is)));
      }
      cout << fixed << setprecision(10) << area(poly) << endl;
    }
  }
  return 0;
}
