#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;
double dot(complex<double> a, complex<double> b) { return real(conj(a) * b); }
double cross(complex<double> a, complex<double> b) { return imag(conj(a) * b); }
int ccw(complex<double> a, complex<double> b, complex<double> c) {
  b -= a;
  c -= a;
  if (cross(b, c) > EPS) return 1;
  if (cross(b, c) < -EPS) return -1;
  if (dot(b, c) < -EPS) return 2;
  if (norm(b) < norm(c)) return -2;
  return 0;
}
complex<double> crossPoint(pair<complex<double>, complex<double> > l,
                           pair<complex<double>, complex<double> > m) {
  double A = cross(l.second - l.first, m.second - m.first);
  double B = cross(l.second - l.first, l.second - m.first);
  if (fabs(A) < EPS && fabs(B) < EPS)
    return m.first;
  else if (fabs(A) >= EPS)
    return m.first + B / A * (m.second - m.first);
}
vector<complex<double> > convex_cut(vector<complex<double> > G,
                                    pair<complex<double>, complex<double> > l) {
  vector<complex<double> > ans;
  for (int i = 0; i < G.size(); i++) {
    complex<double> A = G[i];
    complex<double> B = G[(i + 1) % G.size()];
    if (ccw(l.first, l.second, A) != -1) ans.push_back(A);
    if (ccw(l.first, l.second, A) * ccw(l.first, l.second, B) < 0)
      ans.push_back(
          crossPoint(pair<complex<double>, complex<double> >(A, B), l));
  }
  return ans;
}
double area(vector<complex<double> > v) {
  double sum = 0.0;
  int n = v.size();
  for (int i = 0; i < n; i++)
    sum += (real(v[i]) - real(v[(i + 1) % n])) *
           (imag(v[i]) + imag(v[(i + 1) % n]));
  return fabs(sum) / 2;
};
int n, m, x, y, cx, cy;
vector<complex<double> > vi;
complex<double> c[10];
int main() {
  while (1) {
    cin >> n >> m;
    if (!n && !m) break;
    for (int i = 0; i < n; i++) {
      cin >> x >> y;
      vi.push_back(complex<double>(x, y));
    }
    for (int i = 0; i < m; i++) {
      cin >> cx >> cy;
      c[i] = complex<double>(cx, cy);
    }
    for (int i = 0; i < m; i++) {
      vector<complex<double> > cp = vi;
      for (int j = 0; j < m; j++) {
        if (i == j) continue;
        double X = (c[j].real() - c[i].real()) / 2.0;
        double Y = (c[j].imag() - c[i].imag()) / 2.0;
        complex<double> A =
            complex<double>(c[i].real() + c[j].imag() - c[i].imag() + X,
                            c[i].imag() - (c[j].real() - c[i].real()) + Y);
        complex<double> B = complex<double>(c[i].real() + X, c[i].imag() + Y);
        cp = convex_cut(cp, pair<complex<double>, complex<double> >(A, B));
      }
      printf("%.1f\n", area(cp));
    }
    vi.clear();
    ;
  }
  return 0;
}
