#!/usr/bin/env python3 # Modul s haldou ze standardní knihovny import heapq def load_line(): """Funkce pro načtení řádku čísel ze vstupu""" return [int(val) for val in input().split(" ")] # Načtení rozměrů pohoří R, S = load_line() # Pole pro uchování výšek políček pohoří surface = [None] * R # Připravíme si pole navštívených vrcholů pro Dijkstrův algoritmus a haldu visited = [None] * R heap = [] # Načítáme pohoří ze vstupu po řádcích for i in range(R): line = load_line() # Vložíme do haldy políčka okraje if i == 0 or i == R - 1: for j in range(S): heap.append((line[j], i, j)) else: heap.extend([(line[0], i, 0), (line[S - 1], i, S - 1)]) surface[i] = line visited[i] = [False] * S heapq.heapify(heap) total_volume = 0 while heap: # Vyndáme z haldy vrchol políčka, do kterého vede aktuálně nejnižší cesta height, r, s = heapq.heappop(heap) # Zkontrolujeme, zda není již uzavřen if visited[r][s]: continue # Uzavřeme jej visited[r][s] = True # Započteme sloupec vody ležící na aktuálním políčku total_volume += height - surface[r][s] # Zrelaxujeme sousedy for neighbor_r, neighbor_s in [(r - 1, s), (r, s - 1), (r + 1, s), (r, s + 1)]: if 0 <= neighbor_s < S and 0 <= neighbor_r < R: # Tady kromě vkládání prvku do haldy počítáme za běhu ohodnocení hrany # Vyhnuli jsme se tak stavbě grafu, který jsme popisovali ve vzorovém řešení. heapq.heappush(heap, (max(surface[neighbor_r][neighbor_s], height), neighbor_r, neighbor_s)) # Vypíšeme zadržené množství vody print(total_volume)