/*
TASK: dist
LANG: C
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SQR(a) ((a)*(a))
#define maxN 5005

typedef struct {
        int x,y;
        } point;
        
int n,p0;
point list[maxN];
int stack[maxN],len=2;

int MIN(int a, int b)
{if (a<b) return a;
else return b;}

int cmp(const void *x, const void *y) 
{
    point b=*(point *)x,c=*(point*)y;
    return -(list[0].x*(b.y-c.y) + b.x*(c.y-list[0].y) + c.x*(list[0].y-b.y));
}

int ori(point a, point b, point c)
{return a.x*(b.y-c.y) + b.x*(c.y-a.y) + c.x*(a.y-b.y);}

void input()
{
     int i;
     point t;
     scanf("%d",&n);++n;
     for (i=0;i<n;++i) scanf("%d%d",&list[i].x,&list[i].y);
     /*printf("!! %d\n",ori(list[3],list[0],list[4]));*/
     for (i=1;i<n;++i) 
         if (list[i].y < list[p0].y) p0 = i;
         else if (list[i].y == list[p0].y && list[i].x < list[p0].x) p0 = i; 
     t = list[0];
     list[0] = list[p0];
     list[p0] = t;
     qsort(list+1,n-1,sizeof(point),cmp);
     /*for (i=0;i<n;++i) printf("%d %d\n",list[i].x,list[i].y);*/
}

void solve()
{
     int i,j,best;
     double res;
     stack[0] = 0;
     stack[1] = 1;
     for (i=2;i<n;++i) {
         while (ori(list[stack[len-2]],list[stack[len-1]],list[i]) <= 0) --len;
         stack[len++] = i;
         /*for (j=0;j<len;++j) printf("%d %d ** ",list[stack[j]].x,list[stack[j]].y);
         printf("\n");*/
         }
     while (ori(list[stack[len-2]],list[stack[len-1]],list[0]) <= 0) --len;
     /*for (j=0;j<len;++j) printf("%d %d ** ",list[stack[j]].x,list[stack[j]].y);
         printf("\n");*/
     best = SQR(list[0].x - list[p0].x) + SQR(list[0].y - list[p0].y);
     if (best == 0) best = SQR(list[1].x - list[p0].x) + SQR(list[1].y - list[p0].y);
     for (i=0;i<len;++i)
         if (stack[i] != p0) best = MIN(best,SQR(list[stack[i]].x - list[p0].x) + SQR(list[stack[i]].y - list[p0].y));
     res = sqrt(best);
     printf("%d\n",(int)res);
}
int main()
{
    input();
    solve();
    return 0;
}
