#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <complex>
#include <vector>
#include <assert.h>

static const double EPS = 1e-5;
using namespace std;

typedef complex<double> Complex;
typedef vector<Complex> Polygon;

double cross(const Complex a, Complex b) {
  return imag(conj(a) * b);
}

double dot(Complex a, Complex b) {
  return real(conj(a) * b);
}

double ccw(Complex a, Complex b) {
  return a.real() * b.imag() - a.imag() * b.real();
}

int ccw3(Complex a, Complex b, Complex c) {
  b -= a; c -= a;
  if (cross(b, c) > 0) return 1;
  if (cross(b, c) < 0) return -1;
  if (dot(b, c) < 0) return +2;
  if (dot(b, c) > 0) return -2;
  return 0;
}

double area(Complex a, Complex b, Complex c) {
  Complex v1 = b - a;
  Complex v2 = c - a;
  return abs(v1.real() * v2.imag() - v2.real() * v1.imag()) / 2.0;
}

Complex intersection(const Complex s1, Complex e1, Complex s2, Complex e2) {
  double a = cross(e1 - s1, e2 - s2);
  double b = cross(e1 - s1, e1 - s2);
  if (abs(a) < EPS && abs(b) < EPS) { return s2; }
  if (abs(a) < EPS) { assert(false); }
  return s2 + b / a * (e2 - s2);
}

Polygon convex_cut(const Polygon &P, const Complex s1, const Complex e1) {
  Polygon Q;
  for (int i = 0; i < (int)P.size(); i++) {
    Complex a = P[i];
    Complex b = P[0];
    if (i != (int)P.size() - 1) {
      b = P[i + 1];
    }
    if (ccw3(s1, e1, a) != -1) { Q.push_back(a); }
    if (ccw3(s1, e1, a) * ccw3(s1, e1, b) < EPS) {
      Q.push_back(intersection(s1, e1, a, b));
    }
  }
  return Q;
}

void tyuusen(Complex a, Complex b, Complex &s1, Complex &e1) {
  Complex center = (a + b) / 2.0;
  s1 = center + (b - a) * Complex(0.0, -1000.0);
  e1 = center + (b - a) * Complex(0.0, 1000.0);
}

Polygon island;
Complex point[100];

int main() {
  int n, m;
  while (scanf("%d %d", &n, &m), n|m) {
  island.clear();
  for (int i = 0; i < n; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    island.push_back(Complex(a, b));
  }
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    point[i] = Complex(a, b);
  }
  for (int i = 0; i < m; i++) {
    Polygon voronoi = island;
    for (int j = 0; j < m; j++) {
      if (i == j) { continue; }
      Complex a, b;
      tyuusen(point[i], point[j], a, b);
      voronoi = convex_cut(voronoi, a, b);
    }
    double ans = 0.0;
    for (int k = 0; k < (int)voronoi.size(); k++) {
      Complex next = voronoi[0];
      if (k != (int)voronoi.size() - 1) { next = voronoi[k + 1]; }
      if (abs(voronoi[k].real() - next.real()) < EPS && abs(voronoi[k].imag() - next.imag()) < EPS) { continue; }
      ans += area(point[i], voronoi[k], next);
    }
    printf("%lf\n", ans);
  }
  }
  return 0;
}