//凸包,Andrew算法
//点编号1~n
//返回凸包结果Stack[1~Top]
Point List[maxn<<1],Stack[maxn<<1]; int Top;
bool cmp( Point a , Point b )
{
if ( a.x==b.x ) return a.y<b.y;
else return a.x<b.x;
}
void Andrew( int n )
{
sort ( List+1 , List+n+1 , cmp ); Top = 0;
for ( int i=1 ; i<=n ; i++ )
{
while ( Top>1&&sgn((Stack[Top]-Stack[Top-1])^(List[i]-Stack[Top-1]))<0 ) Top--;
Stack[++Top] = List[i];
}
int k = Top;
for ( int i=n-1 ; i>=1 ; i-- )
{
while ( Top>k&&sgn((Stack[Top]-Stack[Top-1])^(List[i]-Stack[Top-1]))<0 ) Top--;
Stack[++Top] = List[i];
}
}