#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<cstdlib>
#include<cassert>
#include<map>
#include<iomanip>
#define _A_ true
#define EPS 1e-10
#define COUNTER_CLOCKWISE 1
#define CLOCKWISE -1 
#define ONLINE_BACK 2
#define ONLINE_FRONT -2
#define ON_SEGMENT 0
using namespace std;
class Point{
public:
  double x,y;
  Point(double x =0,double y=0):x(x),y(y){}
  Point operator + (Point p){return Point(x+p.x,y+p.y);}
  Point operator - (Point p){return Point(x-p.x,y-p.y);}
  Point operator * (double a){return Point(x*a,y*a);}
  Point operator / (double a){return Point(x/a,y/a);} //もし悪を使うなら要確認
 
  double norm() {return x*x+y*y;}
  double abs() {return sqrt(norm());}
 
  bool operator < (const Point &p) const{
    return x != p.x ? x < p.x : y < p.y; 
  }
 
  bool operator == (const Point &p) const{
    return fabs(x-p.x) < EPS && fabs(y-p.y) < EPS;
  }

};
typedef Point Point;
struct Segment{
public:
  Point p1,p2;
  Segment(Point p = Point(),Point pp = Point()):p1(p),p2(pp){}
};
 
typedef vector<Point> Polygon;
typedef Segment Line;

class Voronoi
{
public:
  Polygon poly;
 
  Voronoi(Polygon poly):poly(poly){}

  double norm(Point p){
    return p.x*p.x+p.y*p.y;
  }
 
  double abs(Point p){
    return sqrt(norm(p));
  }
 
  Point polar(double a,double rad){
    return Point(a*cos(rad),a*sin(rad));
  }
 
  double args(Point p){
    return atan2(p.y,p.x);
  }
 
  double dot(Point a,Point b){
    return a.x*b.x+a.y*b.y;
  }
 
  double cross(Point a,Point b){
    return a.x*b.y-b.x*a.y;
  }
 
  Point project(Segment s,Point p){
    Point base = s.p2 - s.p1;
    double t = dot(p-s.p1,base)/base.norm();
    return s.p1+base*t;
  }
 
  Point reflect (Segment s, Point p){
    return p + (project(s,p)-p)*2.0;
  }
 
  int ccw(Point p0,Point p1,Point p2){
    Point a = p1-p0;
    Point b = p2-p0;
    if(cross(a,b) > EPS) return COUNTER_CLOCKWISE;
    if(cross(a,b) < -EPS) return CLOCKWISE;
    if(dot(a,b) < -EPS) return ONLINE_BACK;
    if(a.norm() < b.norm() ) return ONLINE_FRONT;
    return ON_SEGMENT;
  }
 
  bool isIntersect(Point p1,Point p2,Point p3,Point p4){
    return (ccw(p1,p2,p3) * ccw(p1,p2,p4) <= 0 && ccw(p3,p4,p1) * ccw(p3,p4,p2) <= 0 );
  }
 
  bool isIntersect(Segment s1,Segment s2){
    return isIntersect(s1.p1,s1.p2,s2.p1,s2.p2);
  }

  Point getCrossPointSegments(Segment s1,Segment s2){
    //assert(isIntersect(s1,s2));
    Point 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;
  }


  Point getCrossPointLines( Line s1, Line s2){

    Point a = s1.p2 - s1.p1;
    Point base = s2.p2 -s2.p1;
    return s1.p1 + a * (cross(base, s2.p1 - s1.p1)/cross(base, a));
  }

  Polygon cutPolygon( Polygon P, Line l ){
    Polygon u;
    
    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) != CLOCKWISE ) u.push_back(a);
      if ( ccw(l.p1, l.p2, a) * ccw(l.p1, l.p2, b) == -1 ){
	u.push_back(getCrossPointLines(Segment(a, b), l));
      }
    }   
    return u;
  } 
 
  Line CreateLine(Point p,Point pp){
    Point mid = (p+pp)/2;
    Point sl = pp-p;//原点に5
    double rad = args(sl);
    Point ap = polar(abs(sl),rad+M_PI/2)+mid;
    //ap.x = abs(sl)*cos(rad+M_PI/2)+mid.x;
    //ap.y = abs(sl)*sin(rad+M_PI/2)+mid.y;
    return Line(mid,ap);
  } 
 
  double AreaCalc(Polygon p){
    double area = 0;
    for(int i=0;i<p.size();i++)
      area+=cross(p[i],p[(i+1)%p.size()]);
    return fabs(area)/2.0;
  } 

  //サイトposに対するボロノイセルV(pos)の面積を返す 
  //pointsは多角形の中に存在するサイトの集合]
  //posはpoints中の自分の位置
  double getAreaOfVoronoi(vector<Point>& points,int pos)
  {
    Polygon polx = poly;
    int N = points.size();
    for(int i=0;i<N;i++)
      if(i != pos)
	polx = cutPolygon(polx,CreateLine(points[pos],points[i]));
    return AreaCalc(polx);
  }  

};

int main(){

  int N,M;
  while(cin >> N >> M,N|M){
  
  vector<Point> l(N);
  vector<Point> C(M);
  for(int i=0;i<N;i++)
    {
      cin >> l[i].x >> l[i].y;
      l[i].x += 200,l[i].y += 200;
    }
  for(int i=0;i<M;i++)
    {
      cin >> C[i].x >> C[i].y;
      C[i].x += 200,C[i].y += 200;
    }
  for(int i=0;i<M;i++)
    {

      Polygon poly; 
      for(int j=0;j<N;j++)
	poly.push_back(l[j]);
      Voronoi vor(poly);

      cout << setiosflags(ios::fixed) << setprecision(4) << vor.getAreaOfVoronoi(C,i) << endl;

    }  

  }
  return 0;
}