Cod sursa(job #598014)
#include <fstream>
#include <algorithm>
using namespace std;
const int N=120005;
struct punct{double x,y;} v[N],a[N],b[N];
int A,B,n;
ifstream in("infasuratoare.in");
ofstream out("infasuratoare.out");
inline bool cmp(const punct &a,const punct &b)
{
return a.x<b.x || a.x==b.x && a.y<b.y;
}
inline bool panta(punct a,punct b,punct c)
{
return (a.y-b.y)*(c.x-a.x)<(b.x-a.x)*(c.y-a.y);
}
int main()
{
int i;
in>>n;
for (i=1;i<=n;i++)
in>>v[i].x>>v[i].y;
sort(v+1,v+n+1,cmp);
a[++A]=v[1];
for (i=2;i<n;i++)
{
while (A>1 && panta(a[A-1],a[A],v[i]))
A--;
a[++A]=v[i];
}
b[++B]=v[n];
for (i=n-1;i>1;i--)
{
while (A>1 && !panta(b[A-1],b[A],v[i]))
A--;
b[++A]=v[i];
}
out<<A+B<<"\n";
for (i=1;i<=A;i++)
out<<a[i].x<<" "<<a[i].y<<"\n";
for (i=1;i<=B;i++)
out<<b[i].x<<" "<<b[i].y<<"\n";
return 0;
}