#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define zahyoutype double
int r;
typedef struct Point{zahyoutype x,y;}P;
typedef struct line{P p1,p2;}L;
P zero={0,0};

zahyoutype innerproduct(P p,P q,P o){return (p.x-o.x)*(q.x-o.x)+(p.y-o.y)*(q.y-o.y);}
zahyoutype crossproduct(P p,P q,P o){return (p.x-o.x)*(q.y-o.y)-(p.y-o.y)*(q.x-o.x);}
double crossangle(P p,P q,P o){return atan2(crossproduct(p,q,o),innerproduct(p,q,o));}

double seglen(L s){return hypot(s.p2.x-s.p1.x,s.p2.y-s.p1.y);}
double distPP(P p,P q){return hypot(p.x-q.x,p.y-q.y);}
double distPL(P p,L s){return fabs(crossproduct(p,s.p2,s.p1)/seglen(s));}
double distPS(P p,L s){
	zahyoutype c =innerproduct(   p,s.p2,s.p1);
	zahyoutype ss=innerproduct(s.p2,s.p2,s.p1);
	if(c<=0)return distPP(p,s.p1);
	if(c<=ss)return distPL(p,s);
	return distPP(p,s.p2);
}
P crosspoint(L s,L t){
	zahyoutype x=1;if(x/2==0){puts("type error");exit(0);}
	double deno=(s.p1.x-s.p2.x)*(t.p1.y-t.p2.y)-(t.p1.x-t.p2.x)*(s.p1.y-s.p2.y);
	zahyoutype xnume=  s.p1.x*t.p1.x*(s.p2.y-t.p2.y)-s.p1.x*t.p2.x*(s.p2.y-t.p1.y)-s.p2.x*t.p1.x*(s.p1.y-t.p2.y)+s.p2.x*t.p2.x*(s.p1.y-t.p1.y);
	zahyoutype ynume=-(s.p1.y*t.p1.y*(s.p2.x-t.p2.x)-s.p1.y*t.p2.y*(s.p2.x-t.p1.x)-s.p2.y*t.p1.y*(s.p1.x-t.p2.x)+s.p2.y*t.p2.y*(s.p1.x-t.p1.x));
	P p={xnume/deno,ynume/deno};
	return p;
}

P cross(L s,int r){
	//segment sとx^2+y^2=r^2の交点のうち、s.p1に近い方を求める
	//s.p1が円の外、s.p2が円の中
	P p={0,0};
	P q={s.p2.y-s.p1.y,-(s.p2.x-s.p1.x)};
	L t={p,q};
	P c=crosspoint(s,t);
	double d=distPP(c,p);
	double coe=sqrt(r*r-d*d)/seglen(s);
	P ans={c.x-coe*(s.p2.x-s.p1.x),c.y-coe*(s.p2.y-s.p1.y)};
	return ans;
}

void readpoint(P*p){zahyoutype x=1;scanf(x/2?"%lf%lf":"%ld%ld",&p->x,&p->y);}

double f(P p,P q){
	int coe=1;
	if(crossproduct(p,q,zero)<0){
		P t=p;p=q;q=t;
		coe=-1;
	}	
	double ans;
	if(distPP(p,zero)<r){
		if(distPP(q,zero)<r)ans=crossproduct(p,q,zero)/2;//中中
		else{//中外
			L s={q,p};
			P m=cross(s,r);
			double theta=crossangle(m,q,zero);
			ans=crossproduct(p,m,zero)/2+r*r*theta/2;
		}
	}else{
		L s={p,q};
		if(distPP(q,zero)<r){//外中
			P m=cross(s,r);
			double theta=crossangle(p,m,zero);
			ans=crossproduct(m,q,zero)/2+r*r*theta/2;
		}else{//外外
			if(distPS(zero,s)<r){//交わる
				L s1={p,q};
				P m1=cross(s1,r);
				L s2={q,p};
				P m2=cross(s2,r);
				double theta1=crossangle(p ,m1,zero);
				double theta2=crossangle(m2,q ,zero);
				ans=r*r*theta1/2+crossproduct(m1,m2,zero)/2+r*r*theta2/2;
			}else{
				double theta=crossangle(p,q,zero);
				ans=r*r*theta/2;
			}
		}
	}
	return ans*coe;
}

P a[110];
int main(){
	int n;
	scanf("%d%d",&n,&r);
	for(int i=0;i<n;i++)readpoint(a+i);
	double ans=0;
	for(int i=0;i<n;i++)ans+=f(a[i],a[(i+1)%n]);
	printf("%.9f\n",ans);
}
