#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
inline bool minimize(T1& a, T2 b) {
  return b < a && (a = b, 1);
}
template <class T1, class T2>
inline bool maximize(T1& a, T2 b) {
  return a < b && (a = b, 1);
}
int const inf = 1 << 29;
double const EPS = 1e-7;
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> p0, complex<double> p1, complex<double> p2) {
  auto a = p1 - p0;
  auto b = p2 - p0;
  if (cross(a, b) > EPS) return +1;
  if (cross(a, b) < -EPS) return -1;
  if (dot(a, b) < -EPS) return +2;
  if (norm(a) < norm(b)) return -2;
  return 0;
}
double area(vector<complex<double> >& g) {
  double ret = 0;
  for (int i = 0; i < (int)g.size(); i++) {
    ret += cross(g[i], g[(i + 1) % g.size()]);
  }
  return abs(ret) / 2.0;
}
struct Line : public vector<complex<double> > {
  Line(complex<double> a, complex<double> b) { push_back(a), push_back(b); }
};
Line perpendicular_bisector(complex<double>& a, complex<double>& b) {
  complex<double> c = (a + b) / 2.0;
  complex<double> p = complex<double>(c.real() + (a.imag() - b.imag()),
                                      c.imag() - (a.real() - b.real()));
  return Line(c, p);
}
complex<double> crosspointLL(Line const& a, Line const& b) {
  complex<double> va = a[1] - a[0], vb = b[1] - b[0];
  double d = cross(vb, va);
  if (abs(d) < EPS) return b[0];
  return a[0] + va * cross(vb, b[1] - a[0]) * (1.0 / d);
}
vector<complex<double> > convex_cut(vector<complex<double> >& g,
                                    Line const& l) {
  vector<complex<double> > ret;
  for (int i = 0; i < (int)g.size(); i++) {
    if (ccw(l[0], l[1], g[i]) != -1) ret.push_back(g[i]);
    if (ccw(l[0], l[1], g[i]) * ccw(l[0], l[1], g[(i + 1) % g.size()]) < 0) {
      ret.push_back(crosspointLL(Line(g[i], g[(i + 1) % g.size()]), l));
    }
  }
  return ret;
}
int main() {
  int N, M;
  while (cin >> N >> M && (N | M)) {
    vector<complex<double> > g;
    for (int i = 0; i < (int)N; i++) {
      double x, y;
      cin >> x >> y;
      g.push_back(complex<double>(x, y));
    }
    vector<complex<double> > ps;
    for (int i = 0; i < (int)M; i++) {
      double x, y;
      cin >> x >> y;
      ps.push_back(complex<double>(x, y));
    }
    for (int i = 0; i < (int)M; i++) {
      auto p = g;
      for (int j = 0; j < (int)M; j++) {
        if (i == j) continue;
        p = convex_cut(p, perpendicular_bisector(ps[i], ps[j]));
      }
      printf("%.10f\n", area(p));
    }
  }
  return 0;
}
