/*
TASK: dist
LANG: C++
*/
#include <stdio.h>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;

struct point
{
       int x, y;
       point(int a, int b) {x = a; y = b;}
       point(){}
       point operator-(point p)
       {
             return point(x - p.x, y - p.y);
       }
};
vector<point> P;
int lowesti;
bool cmp(point a, point b)
{
     double angle1 = atan2(a.y - P[lowesti].y, a.x - P[lowesti].x);
     double angle2 = atan2(b.y - P[lowesti].y, b.x - P[lowesti].x);
     return angle1 < angle2;
}

long long cross(point p1, point p2)
{
     return p1.x*p2.y - p1.y*p2.x;
} 

point T;
int dist(point p)
{
    return (int)sqrt((p.x - T.x)*(p.x - T.x) + 
                     (p.y - T.y)*(p.y - T.y));
}

int main()
{
    int n;
    scanf("%d", &n);
    scanf("%d%d", &T.x, &T.y);
    for (int i = 0; i < n; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        P.push_back(point(x, y));
    }
    
    int lowesty = 1000001;    
    for (int i = 0; i < n; i++)
     if (P[i].y < lowesty)
     {
          lowesti = i;
          lowesty = P[i].y;
     }
    
    sort(P.begin(), P.begin() + n, cmp);
    
    vector<point> v;
    if (P[1].x == P[lowesti].x && P[1].y == P[lowesti].y) swap(P[1], P[0]);
    v.push_back(P[0]);
    v.push_back(P[1]);
    
    for (int i = 2; i < n; i++)
    {
        point c = P[i];
        if (cross(v[v.size() - 1] - v[v.size() - 2], c - v[v.size() - 2]) > 0)
         v.push_back(c);
        else
        {
            v.pop_back();
            while (v.size() > 2)
            {
                 if (cross(v[v.size() - 1] - v[v.size() - 2],
                                         c - v[v.size() - 2]) > 0) break;
                 v.pop_back();
            }
            v.push_back(c);
        }
    }
    
    //for (int i = 0; i < v.size(); i++)
     //printf("%d %d\n", v[i].x, v[i].y);
    int mindist = 1000000000;
    for (int i = 0; i < v.size(); i++)
     mindist = min(mindist, dist(v[i]));
    printf("%d\n", mindist); 
    return 0;
}     
