https://www.acmicpc.net/problem/17143
"""
"""
from sys import stdin
input = stdin.readline
R, C, M = map(int, input().split()) # R행 C열 : 격자판의 크기, M : 상어의 수
# 인덱스0, 1 : 상어의 위치, 인덱스2 : 상어의 속력, 인덱스3 : 상어의 이동방향(1:북, 2:남, 3:동, 4:서), 인덱스4 : 상어의 크기
shark_info = [ list(map(int, input().split())) for _ in range(M) ]
pan = [ [ [] for _ in range(C+1) ] for _ in range(R+1) ]
answer = 0 # 낚시왕이 잡은 상어 크기의 합
for r, c, s, d, z in shark_info: # 상어의 정보 격자판에 업데이트
pan[r][c].append((s, d, z))
dx, dy = [0, -1, 1, 0, 0], [0, 0, 0, 1, -1] # [의미없는숫자, 북, 남, 동, 서]
def shark_move(): # 상어의 이동
tmp = [ [ [] for _ in range(C+1) ] for _ in range(R+1) ] # 빈 배열을 만들어 상어의 이동을 기록한다.
for x in range(1, R+1):
for y in range(1, C+1):
if pan[x][y]: # 만약 상어 정보가 업데이트 되어있는 배열에 상어가 있다면
s, d, z = pan[x][y].pop()
mx = x
my = y
for _ in range(s):
if 1 <= mx + dx[d] <= R and 1 <= my + dy[d] <= C: # 범위 내에 있다면 이동한다.
mx += dx[d]
my += dy[d]
else: # 범위내에 없다면 반대 방향으로 바꾸어서 이동한다.
if d == 1: d = 2
elif d == 2: d = 1
elif d == 3: d = 4
elif d == 4: d = 3
mx += dx[d]
my += dy[d]
if not tmp[mx][my]: # 도착지에 상어가 없다면 상어 정보를 업데이트 한다.
tmp[mx][my].append((s, d, z))
else: # 도착지에 상어가 있다면 상어의 크기를 비교하여 큰 상어의 정보를 업데이트 한다.
ps, pd, pz = tmp[mx][my].pop()
if z > pz: tmp[mx][my].append((s, d, z))
elif z < pz: tmp[mx][my].append((ps, pd, pz))
return tmp
for i in range(1, C+1):
for j in range(1, R+1): # 낚시왕이 있는 열에 있는 상어 중에서 땅(1행)과 제일 가까운 상어를 잡는다.
if pan[j][i]: # 만약 상어가 있다면
s, d, z = pan[j][i].pop()
answer += z # 상어 크기의 합을 구하고 pop()를 했으니 격자판에서 잡은 상어가 사라진다.
break
pan = shark_move() # 모든 상어가 이동하고 좌표가 업데이트된 배열을 돌려받는다.
print(answer)
# 헷갈린점
# 1. 상어를 움직여도 두번 실행될 수 있다. (함수를 구현해서 새로운 n차원 배열을 만들어 return 하는 방식으로 해결)
# 2. 상어 잡아먹는거 미 구현 (상어의 이동이 끝나면 해당 위치에 상어가 있는지 없는지 확인 후 만약 있다면 크기를 비교하는 식으로 해결)
문제에 주어진대로 구현하면 되지만 상어가 이동을 할때는 새로운 함수에 빈 배열을 새로 만들어 모든 상어의 이동이 끝나면 배열을 돌려받는 식으로 하는걸 생각 못했다.