#include <bits/stdc++.h>
static const double EPS = 1e-5;
using namespace std;
double cross(const complex<double> a, complex<double> b) {
  return imag(conj(a) * b);
}
double dot(complex<double> a, complex<double> b) { return real(conj(a) * b); }
double ccw(complex<double> a, complex<double> b) {
  return a.real() * b.imag() - a.imag() * b.real();
}
int ccw3(complex<double> a, complex<double> b, complex<double> c) {
  b -= a;
  c -= a;
  if (cross(b, c) > 0) return 1;
  if (cross(b, c) < 0) return -1;
  if (dot(b, c) < 0) return +2;
  if (dot(b, c) > 0) return -2;
  return 0;
}
double area(complex<double> a, complex<double> b, complex<double> c) {
  complex<double> v1 = b - a;
  complex<double> v2 = c - a;
  return abs(v1.real() * v2.imag() - v2.real() * v1.imag()) / 2.0;
}
complex<double> intersection(const complex<double> s1, complex<double> e1,
                             complex<double> s2, complex<double> e2) {
  double a = cross(e1 - s1, e2 - s2);
  double b = cross(e1 - s1, e1 - s2);
  if (abs(a) < EPS && abs(b) < EPS) {
    return s2;
  }
  if (abs(a) < EPS) {
    assert(false);
  }
  return s2 + b / a * (e2 - s2);
}
vector<complex<double> > convex_cut(const vector<complex<double> > &P,
                                    const complex<double> s1,
                                    const complex<double> e1) {
  vector<complex<double> > Q;
  for (int i = 0; i < (int)P.size(); i++) {
    complex<double> a = P[i];
    complex<double> b = P[0];
    if (i != (int)P.size() - 1) {
      b = P[i + 1];
    }
    if (ccw3(s1, e1, a) != -1) {
      Q.push_back(a);
    }
    if (ccw3(s1, e1, a) * ccw3(s1, e1, b) < EPS) {
      Q.push_back(intersection(s1, e1, a, b));
    }
  }
  return Q;
}
void tyuusen(complex<double> a, complex<double> b, complex<double> &s1,
             complex<double> &e1) {
  complex<double> center = (a + b) / 2.0;
  s1 = center + (b - a) * complex<double>(0.0, -1000.0);
  e1 = center + (b - a) * complex<double>(0.0, 1000.0);
}
vector<complex<double> > island;
complex<double> point[100];
int main() {
  int n, m;
  while (scanf("%d %d", &n, &m), n | m) {
    for (int i = 0; i < n; i++) {
      int a, b;
      scanf("%d %d", &a, &b);
      island.push_back(complex<double>(a, b));
    }
    for (int i = 0; i < m; i++) {
      int a, b;
      scanf("%d %d", &a, &b);
      point[i] = complex<double>(a, b);
    }
    for (int i = 0; i < m; i++) {
      vector<complex<double> > voronoi = island;
      for (int j = 0; j < m; j++) {
        if (i == j) {
          continue;
        }
        complex<double> a, b;
        tyuusen(point[i], point[j], a, b);
        voronoi = convex_cut(voronoi, a, b);
      }
      double ans = 0.0;
      for (int k = 0; k < (int)voronoi.size(); k++) {
        complex<double> next = voronoi[0];
        if (k != (int)voronoi.size() - 1) {
          next = voronoi[k + 1];
        }
        if (abs(voronoi[k].real() - next.real()) < EPS &&
            abs(voronoi[k].imag() - next.imag()) < EPS) {
          continue;
        }
        ans += area(point[i], voronoi[k], next);
      }
      printf("%lf\n", ans);
    }
  }
  return 0;
}
