#include <bits/stdc++.h>
using namespace std;
namespace std {
bool operator<(const complex<double>& a, const complex<double>& b) {
  return a.real() != b.real() ? a.real() < b.real() : a.imag() < b.imag();
}
bool cmp_y(const complex<double>& a, const complex<double>& b) {
  return a.imag() != b.imag() ? a.imag() < b.imag() : a.real() < b.real();
}
bool operator==(const complex<double>& a, const complex<double>& b) {
  return abs(a - b) < (1e-10);
}
}  // namespace std
double dot(complex<double> a, complex<double> b) {
  return a.real() * b.real() + a.imag() * b.imag();
}
double cross(complex<double> a, complex<double> b) {
  return a.real() * b.imag() - a.imag() * b.real();
}
int ccw(complex<double> a, complex<double> b, complex<double> c) {
  b -= a;
  c -= a;
  if (cross(b, c) > (1e-10)) return +1;
  if (cross(b, c) < -(1e-10)) return -1;
  if (dot(b, c) < 0) return +2;
  if (abs(b) + (1e-10) < abs(c)) return -2;
  return 0;
}
complex<double> intersection(pair<complex<double>, complex<double> > a,
                             pair<complex<double>, complex<double> > b) {
  return a.first + cross(b.second - b.first, a.first - b.first) /
                       (-cross(b.second - b.first, a.second - b.first) +
                        cross(b.second - b.first, a.first - b.first)) *
                       (a.second - a.first);
}
vector<complex<double> > convex_cut(vector<complex<double> > p,
                                    pair<complex<double>, complex<double> > l) {
  vector<complex<double> > ret;
  int n = p.size();
  for (int i = 0; i < n; ++i) {
    if (ccw(l.first, l.second, p[i]) != -1) ret.push_back(p[i]);
    if (ccw(l.first, l.second, p[i]) != -1 ^
        ccw(l.first, l.second, p[(i + 1) % n]) != -1)
      ret.push_back(intersection(
          pair<complex<double>, complex<double> >(p[i], p[(i + 1) % n]), l));
  }
  return ret;
}
double area(vector<complex<double> > p) {
  double ret = 0;
  int n = p.size();
  for (int i = 0; i < n; ++i) {
    ret += cross(p[i], p[(i + 1) % n]) / 2;
  }
  return ret;
}
int main() {
  int N, M;
  while (cin >> N >> M, N || M) {
    vector<complex<double> > I;
    for (int i = 0; i < N; ++i) {
      double x, y;
      cin >> x >> y;
      I.push_back(complex<double>(x, y));
    }
    vector<complex<double> > p;
    for (int j = 0; j < M; ++j) {
      double x, y;
      cin >> x >> y;
      p.push_back(complex<double>(x, y));
    }
    for (int i = 0; i < M; ++i) {
      vector<complex<double> > q = I;
      for (int j = 0; j < M; ++j) {
        if (i == j) continue;
        pair<complex<double>, complex<double> > bisector =
            pair<complex<double>, complex<double> >(
                (p[i] + p[j]) / 2.0,
                (p[i] + p[j]) / 2.0 + (p[j] - p[i]) * complex<double>(0, 1));
        q = convex_cut(q, bisector);
      }
      cout << area(q) << endl;
    }
  }
  return 0;
}
