#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("zc.in");
ofstream g("zc.out");
vector< pair <int,int> > X,Array,Array2;
int N,M,line,col,ind,Result,low,up;
const int limit=2000000000;
pair<int,int> A,B;
inline bool Valid(int x,int y)
{
return x>=-limit && y>=-limit && x<=limit && y<=limit;
}
void Fill(int x,int y)
{
int dx[]={-1,-1,-1,0,0,0,0,0,1,1,1,-2,2};
int dy[]={1,0,-1,-2,-1,0,1,2,-1,0,1,0,0};
for(int i=0;i<13;i++)
if(Valid(x+dx[i],y+dy[i])==1)
X.push_back(make_pair(x+dx[i],y+dy[i]));
}
void Read()
{
int i;
f>>N>>M;
for(i=1;i<=N;i++)
{
int x,y;
f>>x>>y;
Fill(y,x);
}
sort(X.begin(),X.end());
}
void Eliminate()
{
int i;
for(i=0;i<X.size()-1;i++)
{
if(X[i]!=X[i+1])
{
if(X[i].first==0 && X[i].second==0)
continue;
Array.push_back(X[i]);
}
}
if(X[i].first!=0 || X[i].second!=0)
Array.push_back(X[X.size()-1]);
for(int i=0;i<Array.size();i++)
{
pair<int,int> X;
X.first=Array[i].second;
X.second=Array[i].first;
Array2.push_back(X);
}
sort(Array2.begin(),Array2.end());
}
int Lower_bound(vector < pair<int,int> > Array,pair<int,int> val)
{
int left=0,right=Array.size(),middle;
int sol=-1;
while(left<=right)
{
middle=(left+right)/2;
if(Array[middle]<val)
{
sol=middle;
left=middle+1;
}
else
right=middle-1;
}
return sol;
}
int Upper_bound(vector < pair<int,int> > Array,pair<int,int> val)
{
int left=0,right=Array.size(),middle;
int sol=right;
while(left<=right)
{
middle=(left+right)/2;
if(Array[middle]>val)
{
sol=middle;
right=middle-1;
}
else
left=middle+1;
}
return sol;
}
void simulateRoad()
{
int i;
for(i=1;i<=M;i++)
{
char direction;
int distance;
int x;
f>>direction>>distance;
x=distance;
int aux1=0,aux2=0;
pair <int,int> val,val2;
val.first=line;
val.second=col;
switch(direction)
{
case 'S':val.first=col;val.second=line;val2.first=col;val2.second=line-x;low=Lower_bound(Array2,val2);up=Upper_bound(Array2,val);if(up>0 && Array2[up-1].first==col) Result+=up-low-1; line-=distance;break;
case 'N':val.first=col;val.second=line;val2.first=col;val2.second=line+x;low=Lower_bound(Array2,val);up=Upper_bound(Array2,val2);if(up>0 && Array2[up-1].first==col) Result+=up-low-1;line+=distance;break;
case 'E':val2.first=line;val2.second=col+x;low=Lower_bound(Array,val);up=Upper_bound(Array,val2);if(up>0 && Array[up-1].first==line) Result+=up-low-1;col+=distance;break;
case 'V':val2.first=line;val2.second=col-x;low=Lower_bound(Array,val2);up=Upper_bound(Array,val);if(up>0 && Array[up-1].first==line) Result+=up-low-1;col-=distance;break;
}
}
g<<Result<<"\n";
}
int main()
{
Read();
Eliminate();
simulateRoad();
return 0;
}