#include<stdio.h>
#include<vector>
#include<algorithm>
#include<fstream>
#include<assert.h>
using namespace std;
ifstream f("zc.in");
ofstream g("zc.out");
typedef vector<pair<int,int> >::iterator it;
#define MaxN 100100
#define mp make_pair
#define mij ((li+ls)>>1)
#define ll long long
#define MaxS (30*MaxN)
int N,M,I;
ll Sol;
vector<pair<int,int> > A,B,C,D;
char S[MaxS];
inline int abs(int a)
{
return a < 0 ? -a : a;
}
inline void addTraps(int a,int b)
{
for(int i=-2;i<=2;i++)
C.push_back(mp(a,b+i));
for(int i=-1;i<=1;i++)
C.push_back(mp(a-1,b+i)),
C.push_back(mp(a+1,b+i));
C.push_back(mp(a-2,b));
C.push_back(mp(a+2,b));
}
inline int getInt(void)
{
int semn = 1,a = 0;
for(;S[I] != '-' && !isdigit(S[I]);++I);
if(S[I] == '-') semn = -1, I++;
for(;isdigit(S[I]);a = a*10+S[I++]-'0');
return semn*a;
}
void citire(void)
{
int a,b;
f.getline(S,MaxS,EOF);
N = getInt();
M = getInt();
for(int n=1;n<=N;++n)
{
b = getInt();
a = getInt();
addTraps(a,b);
}
}
void creareTraps(void)
{
sort(C.begin(),C.end());
for(int i=0;i<C.size();i++)
if(C[i] != C[i-1] && (C[i].first || C[i].second))
A.push_back(C[i]),
B.push_back(mp(C[i].second,C[i].first));
sort(B.begin(),B.end());
}
inline int cautBinx(int li,int ls,int a,int k)
{
if(li > ls)
return li;
int x = (k == 0) ? B[mij].first : A[mij].first;
if(x >= a)
return cautBinx(li,mij-1,a,k);
return cautBinx(mij+1,ls,a,k);
}
inline int cautBiny(int li,int ls,int a,int k)
{
if(li > ls)
return li;
int x = (k == 0) ? B[mij].second : A[mij].second;
if(x >= a)
return cautBiny(li,mij-1,a,k);
return cautBiny(mij+1,ls,a,k);
}
void Rezolvare(void)
{
char op;
int x,y,a,b,x1,x2,y1,y2,dx,dy;
x = y = 0;
creareTraps();
for(int i=1;i<=M;i++)
{
for(;!isalpha(S[I]);++I);
op = S[I++];
b = getInt();
a = (op == 'E' || op == 'V');
switch(op)
{
case 'N' : dx = b, dy = 0;
break;
case 'E' : dy = b, dx = 0;
break;
case 'S' : dx = -b, dy = 0;
break;
default : dy = -b, dx = 0;
}
if(a)
{
x1 = cautBinx(0,A.size()-1,x,a);
x2 = cautBinx(0,A.size()-1,x+1,a);
y1 = cautBiny(x1,x2-1,y,a);
y2 = cautBiny(x1,x2-1,y+dy,a);
//printf("%d ... %d %d /// y=%d y+dy=%d... %d %d -> ",x,x1,x2,y,y+dy,y1,y2);
}
else
{
x1 = cautBinx(0,A.size()-1,y,a);
x2 = cautBinx(0,A.size()-1,y+1,a);
y1 = cautBiny(x1,x2-1,x,a);
y2 = cautBiny(x1,x2-1,x+dx,a);
//printf("%d ... %d %d /// x=%d x+dx=%d %d %d -> ",y,x1,x2,x,x+dx,y1,y2);
}
//printf("%d %d ..... %d %d\n",x,y,x+dx,y+dy);
x += dx;
y += dy;
Sol += abs(y2-y1);
}
//for(int i=0;i<A.size();i++)
// printf("%d %d\n",A[i].first,A[i].second);
//for(int i=0;i<A.size();i++)
// printf("%d %d\n",B[i].first,B[i].second);
}
int main()
{
citire();
Rezolvare();
g << Sol << "\n";
}