#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
#define EPS 1e-10
using namespace std;

int n,m;

double add(double a,double b){
	if(fabs(a+b)<EPS*(a+b))return 0.0;
	return a+b;
}

struct Point{
	double x,y;
	Point(){}
	Point(double xx,double yy){
		x=xx;
		y=yy;
	}
	Point operator +(Point p){
		return Point(add(x,p.x),add(y,p.y));
	}
	Point operator -(Point p){
		return Point(add(x,-p.x),add(y,-p.y));
	}
	Point operator *(double d){
		return Point(x*d,y*d);
	}
	Point operator /(double d){
		return Point(x/d,y/d);
	}
};

struct Segment{
	Point p1,p2;
	Segment(){}
	Segment(Point pp1,Point pp2){
		p1=pp1;
		p2=pp2;
	}
};
typedef Point Vector;
typedef Segment Line;

typedef vector<Point> Polygon;

double norm(Vector a){
	return add(a.x*a.x,a.y*a.y);
}

double abs(Vector a){
	return sqrt(norm(a));
}

double dot(Vector a,Vector b){
	return add(a.x*b.x,a.y*b.y);
}

double cross(Vector a,Vector b){
	return add(a.x*b.y,-a.y*b.x);
}

Point getCrossPoint(Segment s1,Segment s2){
	Vector base=s2.p2-s2.p1;
	double d1=abs(cross(base,s1.p1-s2.p1));
	double d2=abs(cross(base,s1.p2-s2.p1));
	double t=d1/(d1+d2);
	return s1.p1+(s1.p2-s1.p1)*t;
}

int ccw(Point p0,Point p1,Point p2){
	Vector a=p1-p0;
	Vector b=p2-p0;
	if(cross(a,b)>EPS)return 1;
	if(cross(a,b)<-EPS)return -1;
	if(dot(a,b)<EPS)return 2;
	if(norm(a)<norm(b))return -2;
	return 0;
}

Polygon convex_cut(const Polygon& P,const Line& l){
	Polygon Q;
	for(int i=0;i<P.size();i++){
		Point A=P[i], B=P[(i+1)%P.size()];
		if(ccw(l.p1,l.p2,A)!=-1)Q.push_back(A);
		if(ccw(l.p1,l.p2,A)*ccw(l.p1,l.p2,B)<0){
			Q.push_back(getCrossPoint(Line(A,B),l));
		}
	}
	return Q;
}

double getArea(const Polygon& P){
	double A=0;
	for(int i=0;i<P.size();i++){
		A+=cross(P[i],P[(i+1)%P.size()]);
	}
	return A/2.0;
}

Point c[11];
Polygon l;
int main(void){
	while(1){
		scanf("%d %d",&n,&m);
		if(n+m==0)break;
		l.clear();
		for(int i=0;i<n;i++){
			double x,y;
			scanf("%lf%lf",&x,&y);
			l.push_back(Point(x,y));
		}
		for(int i=0;i<m;i++){
			scanf("%lf%lf",&c[i].x,&c[i].y);
		}
		for(int i=0;i<m;i++){
			Polygon li=l;
			for(int j=0;j<m;j++){
				if(i==j)continue;
				Point l1=(c[i]+c[j])/2.0;
				Vector base=c[j]-c[i];
				Vector base2=Vector(-base.y,base.x);
				Point l2=l1+base2;
				li=convex_cut(li,Line(l1,l2));
			}
			printf("%.10f\n",getArea(li));
		}
	}
	return 0;
}