struct point{
double x,y;
point(){
x=y=0;
}
point(double x,double y){
this->x=x;this->y=y;
}
bool operator < (const point & a)const {
return y<a.y||(y==a.y&&x<a.x);
}
};
typedef point vector;
vector operator+(vector &a,vector &b){
return vector(a.x+b.x,a.y+b.y);
}
vector operator-(vector &a,vector &b){
return vector(a.x-b.x,a.y-b.y);
}
double outer_product(vector a,vector b){
return a.x*b.y-a.y*b.x;
}
int convex_hull(point * p,int n,point *ch){
sort(P,P+n);
int m=0;
for(int i=0;i<n;i++){
while(m>1&&outer_product(ch[m-1]-ch[m-2],p[i]-ch[m-2])<0)m--;
ch[m++]=p[i];
}
int k=m;
for(int i=n-2;i>=0;i--){
while(m>k&&outer_product(ch[m-1]-ch[m-2],p[i]-ch[m-2])<0)m--;
ch[m++]=p[i];
}
return m-1;
}