#include <cstdio>
#include <algorithm>
#include <vector>
#define x first
#define y second
using namespace std;
typedef pair<int, int> point;
const int N = 1400000;
const int INF = 0x7fffffff;
int n, m, nr, xc, yc, nextx, nexty;
vector<point> v, p;
inline int min(int x, int y) {
if (x < y)
return x;
return y;
}
inline int max(int x, int y) {
if (x > y)
return x;
return y;
}
void make_points(int a, int b) {
for (int i = a - 2; i <= a + 2; ++i)
for (int j = b - 2; j <= b + 2; ++j)
if ( (abs(i - a) + abs(j - b) <= 2) && i != 0 && j != 0) {
v.push_back(make_pair(i, j));
p.push_back(make_pair(j, i));
}
}
void read() {
v.push_back(make_pair(-INF, -INF));
p.push_back(make_pair(-INF, -INF));
scanf("%d%d\n", &n, &m);
for (int i = 1; i <= n; ++i) {
int a, b;
scanf("%d%d\n", &a, &b);
make_points(a, b);
}
}
void duplicates() {
sort(v.begin(), v.end());
sort(p.begin(), p.end());
int nr = v.size(), nrv = 0, nrp = 0, erase = 1;
for (int i = 1; i < nr; ++i) {
if (v[i] != v[i - 1])
v[++nrv] = v[i];
if (p[i] != p[i - 1]) {
p[++nrp] = p[i];
++erase;
}
}
erase = nr - erase;
for (int i = 0; i <= erase; ++i) {
v.pop_back();
p.pop_back();
}
}
int binary_search(point q, vector<point> a) {
int i, pas = 1 << 21;
for (i = 0; pas; pas >>= 1)
if (i + pas <= nr && a[i + pas] <= q)
i += pas;
return i;
}
int search(char dir, int lg) {
int plusx = 0, plusy = 0;
if (dir == 'N')
plusy = 1;
else
if (dir == 'S')
plusy = -1;
else
if (dir == 'E')
plusx = 1;
else
plusx = -1;
nextx = xc + plusx * lg;
nexty = yc + plusy * lg;
int left, right;
if (plusx) {
int x1 = min(xc, nextx), x2 = max(xc, nextx);
// printf("CAUT PERECHILE %d %d si %d %d in SORTARE DUPA Y:\n", yc, x1, yc, x2);
left = binary_search(make_pair(yc, x1), p);
right = binary_search(make_pair(yc, x2), p);
// printf("AM GASIT PERECHILE PE POZITIILE %d %d\n", left, right);
xc = nextx;
if (right == left && v[left].y == yc && v[left].x >= x1 && v[left].x <= x2)
return 1;
return right - left;
}
int y1 = min(yc, nexty), y2 = max(yc, nexty);
// printf("CAUT PERECHILE %d %d si %d %d in SORTARE DUPA X:\n", xc, y1, xc, y2);
left = binary_search(make_pair(xc, y1), v);
right = binary_search(make_pair(xc, y2), v);
// printf("AM GASIT PERECHILE PE POZITIILE %d %d\n", left, right);
yc = nexty;
if (right == left && v[left].x == xc && v[left].y >= y1 && v[left].y <= y2)
return 1;
return right - left;
}
void solve() {
nr = v.size();
/*printf("SORTARE DUPA X:\n");
for (int i = 1; i <= nr; ++i)
printf("%d %d\n", v[i].x, v[i].y);
printf("\nSORTARE DUPA Y:\n");
for (int i = 1; i <= nr; ++i)
printf("%d %d\n", p[i].x, p[i].y);
printf("\n");*/
int total = 0;
for (int i = 1; i <= m; ++i) {
char dir;
int lg;
scanf("%c %d\n", &dir, &lg);
total += search(dir, lg);
}
printf("%d\n", total);
}
int main() {
freopen("zc.in", "r", stdin);
freopen("zc.out", "w", stdout);
read();
duplicates();
solve();
return 0;
}