#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;
double cross(complex<double> a, complex<double> b) {
  return a.real() * b.imag() - a.imag() * b.real();
}
vector<complex<double> > convexCut(vector<complex<double> >& g,
                                   complex<double> p, complex<double> q) {
  vector<complex<double> > res;
  int n = g.size();
  for (int i = 0; i < n; i++) {
    complex<double> A(g[i]), B(g[(i + 1) % n]);
    double p1 = cross(q - p, A - p);
    double p2 = cross(q - p, B - p);
    if (p1 > -EPS) res.push_back(A);
    if (p1 * p2 < -EPS)
      res.push_back(A + cross(q - p, q - A) / cross(q - p, B - A) * (B - A));
  }
  return res;
}
double getArea(vector<complex<double> >& g) {
  double res = 0.0;
  for (int i = 0; i < g.size(); i++) res += cross(g[i], g[(i + 1) % g.size()]);
  return abs(res) * 0.5;
}
int main() {
  int n, m;
  while (cin >> n >> m && (n | m)) {
    vector<complex<double> > A, B;
    double a, b;
    for (int i = 0; i < n; i++) {
      cin >> a >> b;
      A.push_back(complex<double>(a, b));
    }
    for (int i = 0; i < m; i++) {
      cin >> a >> b;
      B.push_back(complex<double>(a, b));
    }
    for (int i = 0; i < m; i++) {
      vector<complex<double> > tmp = A;
      for (int j = 0; j < m; j++) {
        if (i == j) continue;
        complex<double> mid = (B[i] + B[j]) / 2.0;
        complex<double> p = mid + (B[i] - B[j]) * complex<double>(0, 1);
        if (cross(p - mid, B[i] - mid) > EPS) swap(p, mid);
        tmp = convexCut(tmp, p, mid);
      }
      cout << getArea(tmp) << endl;
    }
  }
}
