#include <iostream>
#include <complex>
#include <vector>
#include <algorithm>
#include <cstdio>

using namespace std;

typedef complex<double> P;

const double EPS = 1e-8;

double cross(P a, P b){
  return a.real() * b.imag() - a.imag() * b.real();
}

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 getArea(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(res) * 0.5;
}

int main(){
  int n, m;
  while(cin >> n >> m && (n|m)){
    vector<P> A, B;
    double a, b;
    for(int i=0;i<n;i++){
      cin >> a >> b;
      A.push_back(P(a, b));
    }
    for(int i=0;i<m;i++){
      cin >> a >> b;
      B.push_back(P(a, b));
    }
    for(int i=0;i<m;i++){
      vector<P> tmp = A;
      for(int j=0;j<m;j++){
        if(i == j) continue;
        P mid = (B[i] + B[j]) / 2.0;
        P p = mid + (B[i] - B[j]) * P(0, 1);
        if(cross(p-mid, B[i]-mid) > EPS) swap(p, mid);
        tmp = convexCut(tmp, p, mid);
      }
      printf("%.5f\n", getArea(tmp));
    }
  }
}