#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-7;
typedef complex<double> P;
struct L {
  double angle;
  P p, q;
  L(P p, P q) : p(p), q(q), angle(arg(q - p)) {}
  bool operator<(const L &l) const { return angle < l.angle; }
};
bool operator<(const P &a, const P &b) {
  return make_pair(real(a), imag(a)) < make_pair(real(b), imag(b));
}
double dot(P a, P b) { return real(conj(a) * b); }
double cross(P a, P b) { return imag(conj(a) * b); }
double angle(P a, P b) { return arg(conj(a) * b); }
L pointBisector(P p, P q) {
  P cen = (p + q) * 0.5;
  return L(cen, cen + (q - p) * P(0, 1));
}
vector<P> convexCut(vector<P> g, P p, P q) {
  vector<P> res;
  int n = g.size();
  for (int i = 0; i < n; i++) {
    P 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 polygonArea(vector<P> g) {
  double res = 0.0;
  for (int i = 0; i < g.size(); i++) res += cross(g[i], g[(i + 1) % g.size()]);
  return abs(0.5 * res);
}
int main() {
  int n, m;
  while (cin >> n >> m) {
    if (!n && !m) break;
    vector<P> island;
    vector<P> cas;
    for (int i = 0; i < n; i++) {
      int a, b;
      cin >> a >> b;
      island.push_back(P(a, b));
    }
    for (int i = 0; i < m; i++) {
      int a, b;
      cin >> a >> b;
      cas.push_back(P(a, b));
    }
    for (int i = 0; i < m; i++) {
      vector<P> temp = island;
      for (int j = 0; j < m; j++) {
        if (j == i) continue;
        L nitou = pointBisector(cas[i], cas[j]);
        if (cross(nitou.q - nitou.p, cas[i] - nitou.p) > 0) {
          temp = convexCut(temp, nitou.p, nitou.q);
        } else {
          temp = convexCut(temp, nitou.q, nitou.p);
        }
      }
      double s = polygonArea(temp);
      cout << s << endl;
    }
  }
  return 0;
}
