double cross(Point a,Point b)
{
return a.x*b.y-a.y*b.x;
}
double mul(Point p0,Point p1,Point p2)
{
return cross(p1-p0,p2-p0);
}
double dis(Point a)
{
return sqrt(a.x*a.x+a.y*a.y);
}
bool cmp(Point a,Point b)
{
if(dcmp(mul(p[0],a,b))==0)
return dis(a-p[0])<dis(b-p[0]);
else
return dcmp(mul(p[0],a,b))>0;
}
int Graham(int n)
{
int i,k = 0,top;
Point tmp;
for(i = 0 ; i < n; i++)
{
if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))
k = i;
}
if(k!=0)
{
tmp = p[0];
p[0] = p[k];
p[k] = tmp;
}
sort(p+1,p+n,cmp);
ch[0] = p[0];
ch[1] = p[1];
top = 1;
for(i = 2; i < n ; i++)
{
while(top>0&&dcmp(mul(ch[top-1],ch[top],p[i]))<0)
top--;
top++;
ch[top] = p[i];
}
return top;
}