#include <bits/stdc++.h>
using namespace std;
const long double EPS = 1e-10;
const long double PI = acos((long double)(-1));
int sgn(long double a) {
  if (a < -EPS) return -1;
  if (a > EPS) return 1;
  return 0;
}
int sgn(long double a, long double b) { return sgn(b - a); }
bool near(complex<long double> a, complex<long double> b) {
  return !sgn(abs(a - b));
}
bool lessP(const complex<long double> &l, const complex<long double> &r) {
  if (sgn(l.real(), r.real())) return l.real() < r.real();
  if (sgn(l.imag(), r.imag())) return l.imag() < r.imag();
  return false;
}
long double cross(complex<long double> a, complex<long double> b) {
  return a.real() * b.imag() - a.imag() * b.real();
}
long double dot(complex<long double> a, complex<long double> b) {
  return a.real() * b.real() + a.imag() * b.imag();
}
int ccw(complex<long double> a, complex<long double> b,
        complex<long double> c) {
  assert(!near(a, b));
  if (near(a, c) || near(b, c)) return 0;
  int s = sgn(cross(b - a, c - a));
  if (s) return s;
  if (dot(b - a, c - a) < 0) return 2;
  if (dot(a - b, c - b) < 0) return -2;
  return 0;
}
long double ssqrt(long double d) {
  d = max<long double>(0, d);
  return sqrt(d);
}
long double sacos(long double d) {
  d = max<long double>(-1, d);
  d = min<long double>(1, d);
  return acos(d);
}
struct L {
  complex<long double> x, y;
  L(){};
  L(complex<long double> x, complex<long double> y) : x(x), y(y){};
};
complex<long double> vec(const L &l) { return l.y - l.x; }
long double abs(const L &l) { return abs(vec(l)); }
int crossLL(const L &l, const L &m, complex<long double> &r) {
  L mm = L(m.x - l.x, m.y - l.x);
  mm.x *= polar<long double>(1.0, -arg(vec(l)));
  mm.y *= polar<long double>(1.0, -arg(vec(l)));
  if (sgn(vec(mm).imag()) == 0) {
    r = l.x;
    if (sgn(mm.x.imag()) == 0) return -1;
    return 0;
  }
  r = mm.x - vec(mm) * (mm.x.imag() / vec(mm).imag());
  r *= polar<long double>(1.0, arg(vec(l)));
  r += l.x;
  return 1;
}
complex<long double> cu(const vector<complex<long double> > &p, int i) {
  int s = p.size();
  return p[(i % s + s) % s];
};
long double area(const vector<complex<long double> > &p) {
  long double u = 0;
  for (int i = 0; i < (int)p.size(); i++) {
    u += cross(cu(p, i), cu(p, i + 1));
  }
  return abs(u) / 2;
}
vector<complex<long double> > convex_cut(const vector<complex<long double> > &p,
                                         const L &l) {
  vector<complex<long double> > q;
  for (int i = 0; i < (int)p.size(); i++) {
    complex<long double> a = cu(p, i), b = cu(p, i + 1);
    if (ccw(l.x, l.y, a) != -1) q.push_back(a);
    if (ccw(l.x, l.y, a) * ccw(l.x, l.y, b) < 0) {
      complex<long double> p;
      crossLL(l, L(a, b), p);
      q.push_back(p);
    }
  }
  return q;
}
bool solve() {
  int n, m;
  cin >> n >> m;
  if (!n) return false;
  vector<complex<long double> > p;
  for (int i = 0; i < n; i++) {
    long double x, y;
    cin >> x >> y;
    p.push_back(complex<long double>(x, y));
  }
  complex<long double> cm[11];
  for (int i = 0; i < m; i++) {
    long double x, y;
    cin >> x >> y;
    cm[i] = complex<long double>(x, y);
  }
  for (int i = 0; i < m; i++) {
    vector<complex<long double> > pp = p;
    for (int j = 0; j < n; j++) {
      if (i == j) continue;
      complex<long double> md = (cm[i] + cm[j]) / (long double)2.0;
      complex<long double> md2 =
          md + (cm[j] - cm[i]) * complex<long double>(0, 1);
      pp = convex_cut(pp, L(md, md2));
    }
    printf("%.20Lf\n", area(pp));
  }
  return true;
}
int main() {
  while (solve()) {
  }
  return 0;
}
