#include  < stdio.h >
#include 
< math.h >
#include 
< algorithm >
using   namespace  std;
const   double  eps = 1e - 8 ;
double  h,ans,cake;
struct  point  {
    
double x,y;
    point ()
{}
    point (
double x,double y):x(x),y(y){}
    
void get(){scanf("%lf%lf",&x,&y);}
}
;
struct  poly {
    point p[
21];
    
int n;
    
void get(){for(int i=0;i<n;i++)p[i].get();p[n]=p[0];}
}
sg;
int  dcmp( double  x) {
    
return (x>eps)-(x<-eps);
}

double  cross(point o,point p,point q) {
    
return (p.x-o.x)*(q.y-o.y)-(p.y-o.y)*(q.x-o.x);
}

point lineinter(point a,point b,point c,point d)
{
    
double u=cross(a,b,c),v=cross(b,a,d);
    
return point((c.x*v+d.x*u)/(u+v),(c.y*v+d.y*u)/(u+v));
}

double  dis(point a,point b) {
    
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

void  push(point a,point b,point  & c,point  & d) {
    
double x=a.y-b.y,y=b.x-a.x,t=h/dis(a,b);
    c
=point(a.x+x*t,a.y+y*t);
    d
=point(b.x+x*t,b.y+y*t);
}

void  cut(point a,point b,poly tg,poly  & g) {
    push(a,b,a,b);
    g.n
=0;
    
for(int i=0;i<tg.n;i++){
        
int u=dcmp(cross(a,b,tg.p[i])),v=dcmp(cross(a,b,tg.p[i+1]));
        
if(u>=0)g.p[g.n++]=tg.p[i];
        
if(u*v<0) g.p[g.n++]=lineinter(a,b,tg.p[i],tg.p[i+1]);
    }

    g.p[g.n]
=g.p[0];
}

double  area(poly g) {
    
double sum=0;
    
for(int i=2;i<g.n;i++)
        sum
+=cross(g.p[0],g.p[i-1],g.p[i]);
    
return 0.5*sum;
}

void  dfs( int  i, int  step,poly g) {
    
if(step+i<sg.n)dfs(i+1,step,g);
    cut(sg.p[i],sg.p[i
+1],g,g);
    
if(step==1)ans=max(ans,cake-area(g));
    
else dfs(i+1,step-1,g);
}

int  main() {
    
int k;
    
while(scanf("%d%d%lf",&sg.n,&k,&h),sg.n||k||h){
        sg.
get();
        cake
=area(sg);
        ans
=0;
        k
=min(k,sg.n);
        
if(k&&h)dfs(0,k,sg);
        printf(
"%.2lf\n",ans);
    }

    
return 0;
}