#include <iostream>
#include <complex>
#include <vector>

using namespace std;

typedef complex<double> P;
const double EPS = 1e-8;

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

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, n){
		vector<P> island, castle;
		for(int i=0;i<n;i++){
			double Ix, Iy; cin >> Ix >> Iy;
			island.push_back(P(Ix,Iy));
		}
		for(int i=0;i<m;i++){
			double Cx, Cy; cin >> Cx >> Cy;
			castle.push_back(P(Cx,Cy));
		}
		for(int i=0;i<m;i++){
			vector<P> area = island;
			for(int j=0;j<m;j++){
				if(i==j) continue;
				P mid = (castle[i]+castle[j])/2.0;
				P dir = (castle[i]-castle[j])*P(0,1);
				P q = mid + dir;
				if(cross(q-mid,castle[i]-mid)>EPS) swap(q,mid);
				area = convexCut(area, q, mid);
			}
			printf("%.6lf\n", polygonArea(area));
		}
	}
}