#include <fstream>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
ifstream f("zc.in");
ofstream g("zc.out");
vector< pair <int,int> > Array,Array2;
int N,M,line,col,ind,Result;
const int limit=2000000000;
pair<int,int> A,B;
vector< pair <int,int> > :: iterator low,up;
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};
inline bool Valid(int x,int y)
{
return x>=-limit && y>=-limit && x<=limit && y<=limit;
}
void Fill(int x,int y)
{
for(int i=0;i<13;i++)
if(Valid(x+dx[i],y+dy[i])==1)
Array.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(Array.begin(),Array.end());
}
void Eliminate()
{
int i,ind=0;
int length=Array.size();
for(i=1;i<Array.size();i++)
{
if(Array[i]!=Array[i+1])
Array[++ind]=Array[i];
}
Array.resize(ind+1);
for(int i=0;i<Array.size();i++)
Array2.push_back(make_pair(Array[i].second,Array[i].first));
sort(Array2.begin(),Array2.end());
}
void simulateRoad()
{
int i;
for(i=1;i<=M;i++)
{
char direction;
int distance;
int x;
f>>direction>>distance;
x=distance;
switch(direction)
{
case 'S':Result+=upper_bound(Array2.begin(),Array2.end(),make_pair(col,line-1))-lower_bound(Array2.begin(),Array2.end(),make_pair(col,line-x)); line-=distance;break;
case 'N':Result+=upper_bound(Array2.begin(),Array2.end(),make_pair(col,line+x))-lower_bound(Array2.begin(),Array2.end(),make_pair(col,line+1));line+=distance;break;
case 'E':Result+=upper_bound(Array.begin(),Array.end(),make_pair(line,col+x))-lower_bound(Array.begin(),Array.end(),make_pair(line,col+1));col+=distance;break;
case 'V':Result+=upper_bound(Array.begin(),Array.end(),make_pair(line,col-1))-lower_bound(Array.begin(),Array.end(),make_pair(line,col-x));col-=distance;break;
}
}
g<<Result<<"\n";
}
int main()
{
Read();
Eliminate();
simulateRoad();
return 0;
}