/*
TASK:area
LANG:C++
*/
#include<stdio.h>
#include<utility>

#include<algorithm>
#include<vector>


#define x first
#define y second
#define pdd pair <double, double>
#define inf 0.00000001
#define ABS(x) (((x)>0)?(x):-(x))

#define DET(p1, p2, p3) ((p1).x*(p2).y + (p2).x*(p3).y + (p3).x*(p1).y - (p1).x*(p3).y - (p2).x*(p1).y - (p3).x*(p2).y)

using namespace std;
typedef struct { double A, B, C; } line;


void input();
void solve();
line make_line(pdd p1, pdd p2);
pdd line_intersection(line L1, line L2);
int intersection(pdd p1, pdd p2, line L);

pdd p1, p2, p;
line A[100];
pdd PTS[10000];
pdd poly[10000];

int N;
int par_flag;

vector <pdd> v;

int main()
{
input();
solve();
return 0;
}


void solve()
{
int count = 1;
int i, j;
pdd my_p;

for(i = 1; i <= N; i++)
        for(j = i + 1; j <= N; j++)
                {
                par_flag = 0;
                my_p = line_intersection(A[i], A[j]);
                if(par_flag == 1) continue;
                PTS[count++] = my_p;
                }
int poly_count = 1;
for(i = 1; i < count; i++)
      for(j = 1; j <= N; j++)
        {
        if(intersection(p, PTS[i], A[j])) break;
       
        if(j == N)
         poly[poly_count++] = PTS[i];
      }
      
poly_count--;
sort(poly + 1, poly + poly_count + 1);


v.push_back(poly[1]);
for(i = 2; i < poly_count; i++)
      if(DET(poly[1], poly[poly_count], poly[i]) >= 0)
       v.push_back(poly[i]);
v.push_back(poly[poly_count]);
for(i = poly_count-1; i > 1; i--)
      if(DET(poly[1], poly[poly_count], poly[i]) < 0) v.push_back(poly[i]);
v.push_back(poly[1]);




double ans = 0;
for(i = 1; i < v.size(); i++)
      {
      ans += DET(v[i-1], v[i], make_pair(0, 0));
      }
ans /= 2;
if(ans < 0) ans = -ans;
printf("%d\n", (int) ans);
}

int intersection(pdd p1, pdd p2, line L)
{
pdd p3, p4;
if(ABS(L.B) < inf) { p3 = make_pair(-L.C/L.A, 0); p4 = make_pair(-L.C/L.A, 1); }
else
    {
    p3 = make_pair(0, -L.C/L.B);
    p4 = make_pair(1, (-L.C - L.A)/L.B);
    }

double d1 = DET(p3, p4, p1);
double d2 = DET(p3, p4, p2);
if(ABS(d1) < inf) return 0;
if(ABS(d2) < inf) return 0;

if(d1 > 0 && d2 < 0)
 return 1;
if(d1 < 0 && d2 > 0)
 return 1;

return 0;
}



pdd line_intersection(line L1, line L2)
{
pdd ans;
double x = L1.B*L2.A - L2.B*L1.A;
if(ABS(x) < inf) { par_flag = 1; return make_pair(-1, -1); }

ans.x = (L2.B*L1.C - L1.B*L2.C) / (L1.B*L2.A - L2.B*L1.A);
ans.y = (L2.C*L1.A - L1.C*L2.A) / (L1.B*L2.A - L2.B*L1.A);
return ans;
}


void input()
{
double xx1, xx2, yy1, yy2;

scanf("%lf%lf%lf%lf", &p1.x, &p1.y, &p2.x, &p2.y);
scanf("%lf%lf", &p.x, &p.y);
scanf("%d", &N);

for(int i = 1; i <= N; i++)
        {
        scanf("%lf%lf%lf%lf", &xx1, &yy1, &xx2, &yy2);
        A[i] = make_line(make_pair(xx1, yy1), make_pair(xx2, yy2));
        }
A[++N] = make_line(make_pair(p1.x, p1.y), make_pair(p1.x, p2.y));
A[++N] = make_line(make_pair(p1.x, p1.y), make_pair(p2.x, p1.y));
A[++N] = make_line(make_pair(p2.x, p2.y), make_pair(p1.x, p2.y));
A[++N] = make_line(make_pair(p2.x, p2.y), make_pair(p2.x, p1.y));
}


line make_line(pdd p1, pdd p2)
{
line ans;
ans.A = p2.y - p1.y;
ans.B = p1.x - p2.x;
ans.C = -ans.A*p1.x - ans.B*p1.y;
return ans;
}

