#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxN 805
#define EPS 1e-12
using namespace std;
struct punct
{
long long x,y;
}P[maxN];
struct dreapta
{
double a,b,c;
long long x,xA,xB;
}D[maxN];
struct segment
{
double xA,yA,xB,yB;
}S[maxN][maxN];
inline bool cmpPunct(punct a,punct b)
{
if(a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
inline bool cmpSegment(segment a,segment b)
{
return a.yA+a.yB<b.yA+b.yB;
}
int ab[maxN];
int cntS[maxN];
inline void swap(long long &a,long long &b)
{
if(a<=b) return;
a^=b;
b^=a;
a^=b;
}
inline int bsFasie(int x,int L,int R)
{
if(L<R)
{
int M=L+(R-L)/2;
if(ab[M]<x) return bsFasie(x,M+1,R);
else
if(ab[M]>x) return bsFasie(x,L,M-1);
else return M;
}
if(ab[L]>x) return L-1;
return L;
}
inline int bsSegment(int x,int y,int lev,int L,int R)
{
if(L<R)
{
double a,b,c;
int M=L+(R-L)/2;
a=S[lev][M].yA-S[lev][M].yB;
b=S[lev][M].xB-S[lev][M].xA;
c=S[lev][M].xA*S[lev][M].yB-S[lev][M].xB*S[lev][M].yA;
double yM=-(a*x+c)/b;
if(yM+EPS<y) return bsSegment(x,y,lev,M+1,R);
else
if(yM>EPS+y) return bsSegment(x,y,lev,L,M-1);
else return -1;
}
double a,b,c;
a=S[lev][L].yA-S[lev][L].yB;
b=S[lev][L].xB-S[lev][L].xA;
c=S[lev][L].xA*S[lev][L].yB-S[lev][L].xB*S[lev][L].yA;
double yM=-(a*x+c)/b;
if(yM==y) return -1;
if(yM<y) return L;
return L-1;
}
int main()
{
int M,N,x,y;
freopen("poligon.in","r",stdin);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;++i) scanf("%lld%lld",&P[i].x,&P[i].y);
P[0]=P[N];
for(int i=0;i<N;++i)
{
D[i].a=P[i].y-P[i+1].y;
D[i].b=P[i+1].x-P[i].x;
D[i].c=P[i].x*P[i+1].y-P[i+1].x*P[i].y;
D[i].x=P[i].x;
if(D[i].b)
{
D[i].xA=P[i].x;
D[i].xB=P[i+1].x;
swap(D[i].xA,D[i].xB);
}
else
{
D[i].xA=P[i].y;
D[i].xB=P[i+1].y;
swap(D[i].xA,D[i].xB);
}
}
sort(P+1,P+N+1,cmpPunct);
ab[0]=0;
ab[++ab[0]]=P[1].x;
for(int i=2;i<=N;++i)
if(P[i].x!=ab[ab[0]]) ab[++ab[0]]=P[i].x;
for(int i=1;i<ab[0];++i)
{
cntS[i]=0;
for(int j=0;j<N;++j)
if(D[j].b&&D[j].xA<=ab[i]&&ab[i+1]<=D[j].xB)
{
S[i][++cntS[i]].xA=ab[i];
S[i][cntS[i]].yA=-(D[j].a*ab[i]+D[j].c)/D[j].b;
S[i][cntS[i]].xB=ab[i+1];
S[i][cntS[i]].yB=-(D[j].a*ab[i+1]+D[j].c)/D[j].b;
}
sort(S[i]+1,S[i]+cntS[i]+1,cmpSegment);
}
freopen("poligon.out","w",stdout);
int count=0;
for(;M--;)
{
scanf("%d%d",&x,&y);
if(x<ab[1]||ab[ab[0]]<x) continue;
int pos=bsFasie(x,1,ab[0]-1);
pos=bsSegment(x,y,pos,1,cntS[pos]);
if(pos&1) ++count;
}
printf("%d\n",count);
return 0;
}