#include<cstdio>
#include<queue>
#include<vector>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include<algorithm>
#define max(a,b) ( ( ( a ) >= ( b ) ) ? ( a ) : (b) )
#define min(a,b) ( ( ( a ) <= ( b ) ) ? ( a ) : (b) )
#define abs(a) ( ( ( a ) >= 0 ) ? ( a ) : (- ( a ) ) )
#define In "adunare.in"
#define Out "adunare.out"
#define N 1003
using namespace std;
char *buffer;
inline void Citeste(int &x)
{
while(*buffer<'0' || '9' < *buffer )buffer++;
x = 0;
while('0'<=*buffer && *buffer <='9')
x = x*10+*buffer-'0',buffer++;
}
inline void Init_Buffer()
{
ifstream fin(In);
fin.seekg(0,ios::end);
int fs = fin.tellg();
buffer = (char*)malloc(fs);
fin.seekg(0,ios::beg);
fin.getline(buffer,fs,NULL);
fin.close();
}
struct Coord
{
int lin,col,cost;
bool operator < ( const Coord &z) const
{
return cost >z.cost;
}
};
priority_queue<Coord>q;
Coord tinta,sursa1,sursa2,r;
vector<Coord>obs,v1,v2;
int a[N][N],A,B,b[N][N],n,sol;
ofstream fout(Out);
void Citire()
{
int i,k;
Citeste(A);
Citeste(B);
return ;
Citeste(n);
Citeste(tinta.lin);Citeste(tinta.col);
a[tinta.lin][tinta.col] = -1;
b[tinta.lin][tinta.col] = -1;
Citeste(sursa1.lin);Citeste(sursa1.col);
Citeste(sursa2.lin);Citeste(sursa2.col);
Citeste(r.lin);Citeste(r.col);
r.cost = 1;
q.push(r);
Citeste(r.lin);Citeste(r.col);Citeste(k);
Coord r;
for(i=0;i<k;i++)
{
Citeste(r.lin);Citeste(r.col);
obs.push_back(r);
a[r.lin][r.col] = -1;
b[r.lin][r.col] = -1;
}
}
void Bordare()
{
int i;
for(i=0;i<=n+1;i++)
{
a[i][0] = a[0][i] = a[n+1][i] = a[i][n+1] = -1;
b[i][0] = b[0][i] = b[n+1][i] = b[i][n+1] = -1;
}
}
inline bool Slin(Coord A,Coord B)
{
if(A.lin==B.lin)
return A.col<B.col;
return A.lin<B.lin;
}
inline bool Scol(Coord A,Coord B)
{
if(A.col==B.col)
return A.lin<B.lin;
return A.col < B.col;
}
void Cerinta_a()
{
int i,x,k;
k = obs.size();
sort(obs.begin(),obs.end(),Slin);
x = 1;
for(i=1;i<k;i++)
{
if(obs[i].lin==obs[i-1].lin && obs[i-1].col+1 == obs[i].col)
x++;
else
x = 1;
sol = max(sol,x);
}
sort(obs.begin(),obs.end(),Scol);
x = 1;
for(i=1;i<k;i++)
{
if(obs[i].col==obs[i-1].col&& obs[i-1].lin+1 == obs[i].lin)
x++;
else
x =1;
sol = max(sol,x);
}
}
inline int Cmmdc(int x,int y)
{
int r;
while(y!=0)
{
r = x%y;
x = y;
y = r;
}
return x;
}
inline void Lee(int a[N][N])
{
Coord p,v;
int i;
int dl[] ={ 1, 0,-1, 0};
int dc[] ={ 0, 1, 0,-1};
a[q.top().lin][q.top().col] = 1;
while(!q.empty())
{
p = q.top();
q.pop();
for(i=0;i<4;i++)
{
v.lin = p.lin + dl[i];
v.col = p.col + dc[i];
if(a[v.lin][v.col]!=-1)
{
if(a[v.lin][v.col]==0)
{
a[v.lin][v.col] = a[p.lin][p.col]+1;
v.cost = a[v.lin][v.col];
q.push(v);
}
else
if(a[v.lin][v.col] > a[p.lin][p.col] +1)
{
a[v.lin][v.col] = a[p.lin][p.col]+1;
v.cost = a[v.lin][v.col];
q.push(v);
}
}
}
}
}
inline void Cerinta_b()
{
int i,j,n,m,y,z;
sol = A+B;
fout<<sol<<"\n";
int sl,sc,cm,dl,dc;
Coord x;
x.lin = sursa1.lin ;
x.col = sursa1.col ;
if(tinta.lin < x.lin )
sl = -1;
else
sl = 1;
if(tinta.col < x.col )
sc = -1;
else
sc = 1;return;
if(x.lin==tinta.lin)
{
do
{
v1.push_back(x);
x.col = x.col + 1 * sc;
}
while(x.col!=tinta.col);
}
else
if(x.col==tinta.col)
{
do
{
v1.push_back(x);
x.lin = x.lin + 1 * sl;
}
while(x.lin!=tinta.lin);
}
else
{
dl = abs(x.lin-tinta.lin);
dc = abs(x.col-tinta.col);
cm = Cmmdc(dl,dc);
dl /= cm;
dc /= cm;
do
{
v1.push_back(x);
x.lin = x.lin + dl*sl;
x.col = x.col + dc*sc;
}
while(x.lin != tinta.lin || x.col != tinta.col );
}
x.lin = sursa2.lin ;
x.col = sursa2.col ;
if(tinta.lin < x.lin )
sl = -1;
else
sl = 1;
if(tinta.col < x.col )
sc = -1;
else
sc = 1;
if(x.lin==tinta.lin)
{
do
{
v2.push_back(x);
x.col = x.col + 1 * sc;
}
while(x.col!=tinta.col);
}
else
if(x.col==tinta.col)
{
do
{
v2.push_back(x);
x.lin = x.lin + 1 * sl;
}
while(x.lin!=tinta.lin);
}
else
{
dl = abs(x.lin-tinta.lin);
dc = abs(x.col-tinta.col);
cm = Cmmdc(dl,dc);
dl /= cm;
dc /= cm;
do
{
v2.push_back(x);
x.lin = x.lin + dl*sl;
x.col = x.col + dc*sc;
}
while(x.lin != tinta.lin || x.col != tinta.col );
}
n = v1.size();
m = v2.size();
Lee(a);
q.push(r);
Lee(b);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
z = a[v1[i].lin][v1[i].col];
y = b[v2[j].lin][v2[j].col];
if(z>0 && y>0)
{
z = max(z,y);
sol = min(sol, z );
}
z = a[v2[j].lin][v2[j].col];
y = b[v1[i].lin][v1[i].col];
if(z>0 && y>0)
{
z = max(z,y);
sol = min(sol, z );
}
}
fout.close();
}
int main()
{
Init_Buffer();
Citire();
Bordare();
Cerinta_a();
Cerinta_b();
return 0;
}