#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <cmath>
#include <climits>
#include <cstdio>
#include <complex>
using namespace std;

typedef long long LL;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<vector<int> > vii;
typedef vector<vector<string> > vss;
typedef pair<int, int> pii;
#define INF 0x7fffffff
//#define INFLL 0x7fffffffffffffff
#define INFLL LLONG_MAX
#define SIZE(v) int((v).size())
#define ALL(v) (v).begin(), (v).end()
#define FOR(i,x) for(int i=0;i<x;i++)
#define FORic(i,y,x) for(int i=y;i<=x;i++)
#define FORdc(i,y,x) for(int i=y;i>=x;i--)
#define FILL(a,v) memset(a, v, sizeof(a))
#define PI 3.14159265358979323846

const double EPS = 1e-7;
typedef complex<double> P; /* _ */
struct L {                 /* üª */
	double angle; // deleteSameLineðgpµÈ¢Àèsv
	P p, q;
	L(P p, P q) : p(p), q(q), angle(arg(q-p)) {}
	bool operator < (const L &l) const {  // deleteSameLineðgpµÈ¢Àèsv
		return angle < l.angle;
    }
};
typedef vector<P> G;


// complexÉå¬ÖWªKvÈê
bool operator < (const P &a, const P &b) {
	return make_pair(real(a),imag(a)) < make_pair(real(b),imag(b));
}

// àÏEOÏEpx(xNga,bÌZ)
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); }

// _pÆ_qÌ¼ñªüðÔ·
L pointBisector(P p, P q) {
	P cen = (p+q)*0.5;
	return L(cen, cen+(q-p)*P(0,1));
}

// Ê½p`gðC2_p, qðÔüªÅØf·é
G convexCut(G g, P p, P q){
	G 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;
}

// ½p`gÌÊÏðßé
double polygonArea(G 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;
		G island;
		vector<P> cas;
		FOR(i, n){
			int a, b;
			cin>>a>>b;
			island.push_back(P(a,b));
		}
		FOR(i, m){
			int a, b;
			cin>>a>>b;
			cas.push_back(P(a,b));
		}
		FOR(i, m){
			G temp = island;
			FOR(j, m){
				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);
			printf("%.6f\n", s);
		}
	}
	return 0;
}