#include<stdio.h>
#define inf "puncte.in"
#define outf "puncte.out"
#define nmax 10010
#define INF 0x3f3f3f3f
using namespace std;
const double eps = 1e-10;
int n;
struct point {
int x, y;
} A, B, p[nmax]; //punctele de baza si lista punctelor conventionale
void read()
{
scanf("%d%d%d%d%d", &n, &A.x, &A.y, &B.x, &B.y);
for(int i=1; i<=n; i++) scanf("%d%d", &p[i].x, &p[i].y);
}
inline int max(int a, int b) { return a>b ? a : b; }
void solve()
{
int ans = -INF;
//unesc punctul de baza A cu punctul conventional i => obtin dreapta de panta m
for(int i=1; i<=n; i++) {
double m;
if( A.x == p[i].x ) m = INF; //dreapta perpendiculara pe OX
else m = (double)( (A.y-p[i].y) * (1.0) ) / (double) ((A.x-p[i].x)*1.0);
if( m==INF ) { //dreapta perpendiculara pe OX ( e simplu :D )
//verific cate puncte se incadreaza intre cele doua drepte perpendiculare pe OX date de A si B
int rez = 0;
for(int j=1; j<=n; j++)
if( ( p[j].x>=A.x && p[j].x<=B.x ) || ( p[j].x>=B.x && p[j].x<=A.x ) ) rez++;
ans = max( ans, rez );
continue;
}
//ecuatiile dreptelor d1 : a1*x + b1*y + c1 = 0 (trece prin A) si d2 : a2*x + b2*y + c2 = 0 (trece prin B)
// d1 || d2
double a1, b1, c1; double a2, b2, c2;
a1 = m; b1 = -1; c1 = -A.y-m*A.x;
a2 = m; b2 = -1; c2 = -B.y-m*B.x;
//printf("%lf %lf %lf\n", a1, b1, c1);
//verific cate puncte sunt intre d1 si d2
int rez = 0;
for(int j=1; j<=n; j++) {
double y1 = -(a1/b1)*(double)( (1.0)*p[j].x ) - (c1/b1);
double y2 = -(a2/b2)*(double)( (1.0)*p[j].x ) - (c2/b2);
//printf("%lf %lf\n", y1, y2);
if( ( p[j].y<=y1 && p[j].y>=y2 ) || ( p[j].y<=y2 && p[j].y>=y1 ) ) rez++;
}
//printf("\n");
ans = max( ans, rez );
}
//unesc punctul de baza B cu punctul conventional i => obtin dreapta de panta m
for(int i=1; i<=n; i++) {
double m;
if( B.x == p[i].x ) m = INF; //dreapta perpendiculara pe OX
else m = (double)( (B.y-p[i].y) * (1.0) ) / (double) ((B.x-p[i].x)*1.0);
if( m==INF ) { //dreapta perpendiculara pe OX ( e simplu :D )
//verific cate puncte se incadreaza intre cele doua drepte perpendiculare pe OX date de A si B
int rez = 0;
for(int j=1; j<=n; j++)
if( ( p[j].x>=A.x && p[j].x<=B.x ) || ( p[j].x>=B.x && p[j].x<=A.x ) ) rez++;
ans = max( ans, rez );
continue;
}
//ecuatiile dreptelor d1 : a1*x + b1*y + c1 = 0 (trece prin B) si d2 : a2*x + b2*y + c2 = 0 (trece prin A)
// d1 || d2
double a1, b1, c1; double a2, b2, c2;
a2 = m; b2 = -1; c2 = -A.y-m*A.x;
a1 = m; b1 = -1; c1 = -B.y-m*B.x;
//printf("%lf %lf %lf\n", a1, b1, c1);
//verific cate puncte sunt intre d1 si d2
int rez = 0;
for(int j=1; j<=n; j++) {
double y1 = -(a1/b1)*(double)( (1.0)*p[j].x ) - (c1/b1);
double y2 = -(a2/b2)*(double)( (1.0)*p[j].x ) - (c2/b2);
//printf("%lf %lf\n", y1, y2);
if( ( p[j].y<=y1 && p[j].y>=y2 ) || ( p[j].y<=y2 && p[j].y>=y1 ) ) rez++;
}
//printf("\n");
ans = max( ans, rez );
}
printf("%d", ans);
}
int main()
{
freopen(inf, "r", stdin); freopen(outf, "w", stdout);
read(); solve();
return 0;
}