#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;
template <class T>
struct point {
  T x, y;
  point operator+(const point &a) const { return (point){x + a.x, y + a.y}; }
  point operator-(const point &a) const { return (point){x - a.x, y - a.y}; }
};
template <class T>
point<T> operator*(T c, const point<T> &a) {
  return (point<T>){c * a.x, c * a.y};
}
template <class T>
T cross(const point<T> &a, const point<T> &b) {
  return a.x * b.y - a.y * b.x;
}
template <class T>
struct line {
  point<T> a, b;
};
template <class T>
struct polygon : vector<point<T> > {
  polygon() {}
  polygon(int n) : vector<point<T> >(n) {}
};
template <class T>
T area2(const polygon<T> &G) {
  int n = G.size();
  T a = 0;
  for (int i = 0; i < (n); i++) a += cross(G[i], G[(i + 1) % n]);
  return abs(a);
}
template <class T>
line<double> perp_bisector(const point<T> &a, const point<T> &b) {
  return (line<double>){(point<double>){(a.x - a.y + b.x + b.y) / 2.0,
                                        (a.y + a.x + b.y - b.x) / 2.0},
                        (point<double>){(a.x + a.y + b.x - b.y) / 2.0,
                                        (a.y - a.x + b.y + b.x) / 2.0}};
}
enum { CCW = 1, CW = -1, ON = 0 };
int ccw(const point<double> &a, const point<double> &b,
        const point<double> &c) {
  double rdir = cross(b - a, c - a);
  if (rdir > EPS) return CCW;
  if (rdir < -EPS) return CW;
  return ON;
}
point<double> get_intersect(const line<double> &L1, const line<double> &L2) {
  double a1 = cross(L1.b - L1.a, L2.b - L2.a);
  double a2 = cross(L1.b - L1.a, L1.b - L2.a);
  if (abs(a1) < EPS) return L1.a;
  return L2.a + a2 / a1 * (L2.b - L2.a);
}
template <class T>
polygon<double> convex_cut(const polygon<T> &G, const line<T> &L) {
  int n = G.size();
  polygon<double> H;
  for (int i = 0; i < (n); i++) {
    int d1 = ccw(L.a, L.b, G[i]);
    int d2 = ccw(L.a, L.b, G[(i + 1) % n]);
    if (d1 != CW) H.push_back(G[i]);
    if (d1 == CCW && d2 == CW || d1 == CW && d2 == CCW) {
      H.push_back(get_intersect(L, (line<T>){G[i], G[(i + 1) % n]}));
    }
  }
  return H;
}
int main() {
  for (int n, m; scanf("%d%d", &n, &m), n;) {
    polygon<double> G(n);
    for (int i = 0; i < (n); i++) scanf("%lf%lf", &G[i].x, &G[i].y);
    point<double> P[10];
    for (int i = 0; i < (m); i++) scanf("%lf%lf", &P[i].x, &P[i].y);
    for (int i = 0; i < (m); i++) {
      polygon<double> Vor = G;
      for (int j = 0; j < (n); j++)
        if (j != i) Vor = convex_cut(Vor, perp_bisector(P[i], P[j]));
      printf("%.9f\n", area2(Vor) / 2);
    }
  }
  return 0;
}
