#include <bits/stdc++.h>
using namespace std;
double cross(const complex<double>& a, const complex<double>& b) {
  return imag(conj(a) * b);
}
double dot(const complex<double>& a, const complex<double>& b) {
  return real(conj(a) * b);
}
struct L : public vector<complex<double> > {
  L(const complex<double>& a, const complex<double>& b) {
    push_back(a);
    push_back(b);
  }
};
bool intersectLS(const L& l, const L& s) {
  return cross(l[1] - l[0], s[0] - l[0]) * cross(l[1] - l[0], s[1] - l[0]) <
         1e-8;
}
complex<double> crosspoint(const L& l, const L& m) {
  double A = cross(l[1] - l[0], m[1] - m[0]);
  double B = cross(l[1] - l[0], l[1] - m[0]);
  if (abs(A) < 1e-8 && abs(B) < 1e-8) return m[0];
  if (abs(A) < 1e-8) assert(false);
  return m[0] + B / A * (m[1] - m[0]);
}
int ccw(complex<double> a, complex<double> b, complex<double> c) {
  b -= a;
  c -= a;
  if (cross(b, c) > +1e-8) return +1;
  if (cross(b, c) < -1e-8) return -1;
  if (dot(b, c) < -1e-8) return +2;
  if (norm(b) < norm(c)) return -2;
  return 0;
}
bool notleft(complex<double> a, complex<double> b, complex<double> c) {
  return (ccw(a, b, c) != +1);
}
bool isIntoG(const vector<complex<double> >& g, const complex<double>& p) {
  size_t sz = g.size();
  for (size_t i = 0; i < sz; i++) {
    if (notleft(p, g[i], g[(i + 1) % sz])) return false;
  }
  return true;
}
bool isfar(vector<complex<double> >& g, complex<double>& p) {
  for (int i = 0; i < g.size(); i++)
    if (abs(g[i] - p) < 1e-8) return false;
  return true;
}
vector<vector<complex<double> > > ConvexCut(vector<complex<double> >& g, L& l) {
  vector<vector<complex<double> > > ret(2);
  int sp, inp = 0;
  for (sp = 0; sp < g.size(); sp++)
    if (intersectLS(l, L(g[sp], g[(sp + 1) % g.size()]))) break;
  complex<double> xp = crosspoint(l, L(g[sp], g[(sp + 1) % g.size()]));
  sp++;
  for (int i = sp; i < sp + g.size(); i++) {
    if (isfar(ret[inp], g[i % g.size()])) ret[inp].push_back(g[i % g.size()]);
    if (intersectLS(l, L(g[i % g.size()], g[(i + 1) % g.size()]))) {
      complex<double> tx =
          crosspoint(l, L(g[i % g.size()], g[(i + 1) % g.size()]));
      if (abs(tx - xp) < 1e-8) continue;
      xp = tx;
      for (int j = 0; j < 2; j++) {
        if (isfar(ret[j], xp)) ret[j].push_back(xp);
      }
      inp++;
    }
  }
  return ret;
}
L trans(complex<double> a, complex<double> b) {
  complex<double> med = (a + b);
  med = complex<double>(med.real() / 2, med.imag() / 2);
  complex<double> hoge = (a - b);
  hoge *= complex<double>(0, 1);
  return L(med + hoge * complex<double>(1000, 0),
           med - hoge * complex<double>(1000, 0));
}
double Area(vector<complex<double> >& g) {
  double ret = 0;
  for (int i = 0; i < g.size(); i++)
    ret += cross(g[i], g[(i + 1) % g.size()]) / 2;
  return ret;
}
int main() {
  cout << setiosflags(ios::fixed) << setprecision(7);
  int N, M;
  while (cin >> N >> M, (N || M)) {
    vector<complex<double> > g, pts;
    for (int i = 0; i < N; i++) {
      double x, y;
      cin >> x >> y;
      g.push_back(complex<double>(x, y));
    }
    for (int i = 0; i < M; i++) {
      double x, y;
      cin >> x >> y;
      pts.push_back(complex<double>(x, y));
    }
    for (int i = 0; i < M; i++) {
      vector<complex<double> > f = g;
      for (int j = 0; j < M; j++) {
        if (i == j) continue;
        L divide = trans(pts[i], pts[j]);
        vector<vector<complex<double> > > cut = ConvexCut(f, divide);
        if (isIntoG(cut[0], pts[i]))
          f = cut[0];
        else
          f = cut[1];
      }
      cout << Area(f) << endl;
    }
  }
}
