딱히 어려운 문제는 아니지만 문제 자체가 복잡하여 시간이 걸리는 문제
제 생각이 많이 들어간 부분만 설명하겠습니다.

위 그림에서 반복 횟수가 짝수인 경우는 L, R 이 의미가 없습니다. 어느 방향으로 회전하든 결국 같은 방향을 가리킵니다.
1 L 6, 1 R 6 인 경우를 직접 비교해보세요.반복 횟수가 홀수인 경우는 반대가 됩니다.
Ex) 명령이 1 L 7, 1 R 7 인 경우
위의 내용을 통해서 짝수 반복일 경우는 두 경우를 나누어 생각할 필요가 없고 홀수인 경우만 두 경우(왼쪽 회전인지 오른쪽 회전인지)를 나누어 생각하면 됩니다.
그리고 방향에 숫자를 적어놨는데 실제 코드상에서 위의 그림처럼 방향에 숫자를 mapping했습니다.
A, B = map(int, input().split())
N, M = map(int, input().split())
brd = [[0] * A for _ in range(B)]
NESW_dic = {
'N': 0,
'E': 1,
'S': 2,
'W': 3,
}
NESW_list = [
[-1, 0],
[0, 1],
[1, 0],
[0, -1]
]
# 로봇 위치 및 방향 정보 받기
robots = []
for i in range(N):
x, y, d = input().split()
r, c = B - int(y), int(x) - 1
robots.append([r, c, NESW_dic[d]])
brd[r][c] = i+1
# 명령 실행
flag = False
for i in range(M):
robot, instruction, loop = input().split()
robot = int(robot)
loop = int(loop)
r, c, d = robots[robot-1]
if instruction == 'L' or instruction == 'R':
new_d = (d + loop) % 4
if loop % 2:
if instruction == 'L':
new_d = (new_d + 2) % 4
robots[robot-1] = [r, c, new_d]
else:
dr, dc = NESW_list[d]
for j in range(1, loop+1):
if 0 <= r + dr < B and 0 <= c + dc < A:
if brd[r+dr][c+dc]:
flag = True
print(f'Robot {brd[r][c]} crashes into robot {brd[r + dr][c + dc]}')
break
else:
brd[r][c] = 0
r, c = r + dr, c + dc
brd[r][c] = robot
robots[robot-1] = [r, c, d]
else:
flag = True
print(f'Robot {brd[r][c]} crashes into the wall')
break
if flag:
break
if not flag:
print('OK')