import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main_BOJ_3190_뱀_0412 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[][] map = new int[N][N];
// 뱀은 1
map[0][0] = 1;
int K = Integer.parseInt(br.readLine());
for(int i=0; i<K; i++) {
st = new StringTokenizer(br.readLine());
// 사과는 2
map[Integer.parseInt(st.nextToken())-1][Integer.parseInt(st.nextToken())-1] = 2;
}
// 방향 전환 정보
Queue<String[]> dirs = new LinkedList<>();
int L = Integer.parseInt(br.readLine());
for(int i=0; i<L; i++) {
st = new StringTokenizer(br.readLine());
dirs.offer(new String[] {st.nextToken(), st.nextToken()});
}
System.out.println(move(map, N, dirs));
}
// 이동
public static int move(int[][] map, int N, Queue<String[]> dirs) {
// 우 하 좌 상
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
// 뱀의 위치 들어있는 큐
Queue<int[]> snake = new LinkedList<>();
// 항상 0,0에 머리 위치
snake.offer(new int[] {0,0});
// 처음 방향은 항상 오른쪽
int x = 0, y = 0, d = 0, time = 0;
// 방향 전환 정보에서 다음 움직일 시간과 방향 가져옴
String[] nextDir = dirs.poll();
int nextT = Integer.parseInt(nextDir[0]);
char nextD = nextDir[1].charAt(0);
while(true) {
// 움직일 시간이 되면
if(nextT == time) {
if(nextD == 'D') d++; // D면 오른쪽
if(nextD == 'L') d--; // L이면 왼쪽
if(d == 4) d = 0; // 인덱스 넘어가면 처음인덱스로
else if(d == -1) d = 3; // 인덱스 넘어가면 마지막 인덱스로
// 다음에 움직일 정보 가져옴
if(!dirs.isEmpty()) {
nextDir = dirs.poll();
nextT = Integer.parseInt(nextDir[0]);
nextD = nextDir[1].charAt(0);
}
}
// 움직이고 시간++
x += dx[d];
y += dy[d];
time++;
// 범위 벗어나면 끝
if(x<0 || x>=N || y<0 || y>=N) break;
// 뱀의 몸과 부딪히면 끝
if(map[x][y] == 1) break;
// 사과가 아닐 때는 꼬리 제거 (사과일 때는 꼬리 유지)
if(map[x][y] != 2) {
int[] tail = snake.poll();
map[tail[0]][tail[1]] = 0;
}
// 이동
snake.offer(new int[] {x, y});
map[x][y] = 1;
}
return time;
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ_3190 {
static int N, K, L;
static Queue<Turn> queue;
static int[][] arr;
static Queue<int[]> snakeQ;
static int[][] deltas = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //뱀은 처음에 오른쪽을 향함
static int cnt;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine()); //보드의 크기
arr = new int[N][N]; //뱀 몸둥이 -1, 사과 2
K = Integer.parseInt(br.readLine()); //사과의 개수
for (int i = 0; i < K; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
arr[r - 1][c - 1] = 2; //1행1열부터 시작
}
L = Integer.parseInt(br.readLine()); //방향 전환 횟수
queue = new LinkedList<>();
for (int i = 0; i < L; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
queue.add(new Turn(Integer.parseInt(st.nextToken()), st.nextToken().charAt(0)));
}
snakeQ = new LinkedList<>();
snakeQ.add(new int[]{0, 0});
arr[0][0] = -1;
snake(0, 0, 0);
System.out.println(cnt);
}
public static void snake(int r, int c, int direct) {
cnt++;
int dr = r + deltas[direct][0];
int dc = c + deltas[direct][1];
if (isAvailable(dr, dc)) { //arr[dr][dc] == -1 걸러줌
if (arr[dr][dc] != 2) { //사과X
int[] tail = snakeQ.poll();
arr[tail[0]][tail[1]] = 0;
}
snakeQ.add(new int[]{dr, dc});
arr[dr][dc] = -1;
if (!queue.isEmpty() && queue.peek().time == cnt) { //방향전환
Turn t = queue.poll();
if (t.dir == 'L') {
direct = (direct - 1) < 0 ? 3 : (direct - 1);
} else {
direct = (direct + 1) % 4;
}
}
snake(dr, dc, direct);
}
}
public static boolean isAvailable(int dr, int dc) {
return dr >= 0 && dc >= 0 && dr < N && dc < N && arr[dr][dc] != -1;
}
//시간이 증가하는 순서로 주어짐
public static class Turn {
int time;
int dir;
Turn(int time, int dir) {
this.time = time;
this.dir = dir;
}
}
}