#include<algorithm> #include<iostream> #include<cstdio> #include<cmath> #define inf 0x7fffffff using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } struct point{ int x,y; }p[50001],s[50001]; int n,top; inline int sqr(int x){return x*x;} int dis(point a,point b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);} int mul(point p1,point p2,point p0){return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);} inline bool cmp(point a,point b){if(!mul(p[0],a,b))return dis(a,p[0])<dis(b,p[0]);else return mul(p[0],a,b)>0;} void graham(){ top=2;int k=0;point t; for(int i=1;i<n;i++) if((p[k].y>p[i].y)||(p[k].y==p[i].y&&p[k].x>p[i].x))k=i; t=p[0];p[0]=p[k];p[k]=t; sort(p+1,p+n,cmp); s[0]=p[0],s[1]=p[1],s[2]=p[2]; for(int i=3;i<n;i++){ while(top&&mul(p[i],s[top],s[top-1])>=0)top--; s[++top]=p[i]; } s[++top]=p[0]; } int convex_diameter(){ double maxd=0.0; if(top==1)return maxd; #define next(i) ((i+1)%top) for(int i=0,j=1;i<top;i++){ while(abs(mul(s[next(i)],s[j],s[i]))-abs(mul(s[next(i)],s[next(j)],s[i]))<0)j=next(j); if(dis(s[i],s[j])>maxd)maxd=dis(s[i],s[j]); if(dis(s[next(i)],s[next(j)])>maxd)maxd=dis(s[next(i)],s[next(j)]); } return maxd; } int main(){ scanf("%d",&n); for(int i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y); graham(); cout<<convex_diameter()<<endl; return 0; }