#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("poligon.in");
ofstream g("poligon.out");
const int NMax = 805;
const int PMax = 60005;
const double eps = 0.0000001;
int N, M, ans;
pair <int, int> Point[NMax];
bool Abs[PMax];
vector <int> V;
vector <pair<int,int> > Vertical[PMax];
int Poz[PMax];
vector <pair< pair<double, double>, pair <double, double> > > Band[PMax];
vector <double> Band2[PMax];
void Read()
{
f >> N >> M;
for(int i = 1; i <= N; i++)
f >> Point[i].first >> Point[i].second, Abs[Point[i].first] = 1;
}
void buildV()
{
for(int i = 0; i <= PMax - 5; i++)
if(Abs[i] == 1)
V.push_back(i), Poz[i] = V.size() - 1;
}
inline void findCoefficients(pair<double, double> p1, pair<double, double> p2, double& A, double& B, double& C)
{
A=p2.second-p1.second;
B=p1.first-p2.first;
C=p2.first*p1.second-p2.second*p1.first;
}
inline double findIntersection(double A, double B, double C, double abs)
{
return (-C - (A * abs)) / B;
}
void buildBand()
{
Point[N + 1] = Point[1];
for(int i = 1; i <= N; i++)
{
double A, B, C;
findCoefficients(Point[i], Point[i + 1], A, B, C);
int x = Poz[Point[i].first], y = Poz[Point[i + 1].first];
if(x > y)
swap(x, y);
Band2[x].push_back(Point[i].second);
for(int j = x; j < y; j++)
{
Band[j].push_back(make_pair(make_pair(V[j], findIntersection(A, B, C, V[j])), make_pair(V[j + 1], findIntersection(A, B, C, V[j + 1]))));
}
}
}
void buildVertical()
{
Point[N + 1] = Point[1];
for(int i = 1; i <= N; i++)
if(Point[i].first == Point[i + 1].first)
Vertical[Point[i].first].push_back(make_pair(min(Point[i].second, Point[i + 1].second), max(Point[i].second, Point[i + 1].second)));
for(int i = 0; i <= PMax - 5; i++)
sort(Vertical[i].begin(), Vertical[i].end());
}
void cleanVertical()
{
for(int i = 0; i <= PMax; i++)
{
int Max = 0;
for(auto j = Vertical[i].begin(); j != Vertical[i].end();)
{
if(j -> second <= Max)
{
Vertical[i].erase(j);
}
else
{
Max = max(Max, j -> second);
j = next(j);
}
}
}
}
bool findPoint(pair <int, int> p)
{
int left = 0, right = Vertical[p.first].size() - 1, mid, sol = 0;
if(right == -1)
return 0;
while(left <= right)
{
mid = (left + right) / 2;
if(Vertical[p.first][mid].first <= p.second)
{
sol = mid;
left = mid + 1;
}
else
right = mid - 1;
}
return Vertical[p.first][sol].second >= p.second;
}
inline bool cmp(pair < pair<double, double>, pair <double, double> > a, pair <pair <double, double>, pair <double, double> >b)
{
return make_pair((a.first.second + a.second.second) / 2, (a.first.first + a.second.first) / 2) < make_pair((b.first.second + b.second.second) / 2, (b.first.first + b.second.first) / 2);
}
void sortBand()
{
for(int i = 0 ;i < V.size() - 1; i++)
{
sort(Band[i].begin(), Band[i].end(), cmp);
sort(Band2[i].begin(), Band2[i].end());
}
}
inline double area(pair <double, double> a, pair <double, double> b, pair <double, double> c)
{
return a.first * b.second + b.first * c.second + c.first * a.second - a.second * b.first - b.second * c.first - c.second * a.first;
}
int findBand(pair <double, double> p)
{
if(p.first < V[0] || p.first > V[V.size() - 1])
return -1;
int left = 0, right = V.size() - 1, mid, sol = 0;
while(left <= right)
{
mid = (left + right) / 2;
if(V[mid] < p.first)
{
sol = mid;
left = mid + 1;
}
else
right = mid - 1;
}
if(sol == V.size() - 1)
return -1;
return sol;
}
void binarySearch(pair <double, double> p)
{
int poz = findBand(p);
if(poz == -1)
return;
int left = 0, right = Band[poz].size() - 1, mid, sol = -1;
while(left <= right)
{
mid = (left + right) / 2;
if(area(Band[poz][mid].first, Band[poz][mid].second, p) >= - eps && area(Band[poz][mid].first, Band[poz][mid].second, p) <=eps)
{
ans++;
return;
}
if(area(Band[poz][mid].first, Band[poz][mid].second, p) < -eps)
{
sol = mid;
left = mid + 1;
}
else
right = mid - 1;
}
int sol2 = 0;
if(V[poz + 1] == p.first)
{
left = 0, right = Band2[poz + 1].size() - 1;
while(left <= right)
{
mid = (left + right) / 2;
if(Band2[poz + 1][mid] == p.second)
{
ans++;
return;
}
if(Band2[poz + 1][mid] < p.second)
{
left = mid + 1;
}
else
{
sol2 = mid;
right = mid - 1;
}
}
sol2 = Band2[poz + 1].size() - 1 - sol2 + 1;
}
sol += sol2;
if((sol + 1) % 2 == 1)
ans++;
}
int main()
{
Read();
buildV();
buildBand();
sortBand();
buildVertical();
cleanVertical();
for(int i = 1; i <= M; i++)
{
pair <int, int> p;
f >> p.first >> p.second;
if(findPoint(p) == 1)
++ans;
else
binarySearch(p);
}
g << ans << "\n";
return 0;
}