use std::{cmp::Reverse, collections::BinaryHeap}; use itertools::iproduct; use proconio::input; fn main() { input! { h: usize, w: usize, a: [[i32; w]; h - 2], } let h = h - 2; let mut heap = BinaryHeap::new(); let mut dist = vec![vec![u32::MAX; w]; h]; for i in 0..h { let d = a[i][0] as u32; dist[i][0] = d; heap.push((Reverse(d), i, 0)); } while let Some((Reverse(d), i, j)) = heap.pop() { if d != dist[i][j] { continue; } if j == w - 1 { println!("{d}"); return; } for (di, dj) in iproduct!(-1..=1, -1..=1) { if (di, dj) == (0, 0) { continue; } let ni = i.wrapping_add_signed(di); let nj = j.wrapping_add_signed(dj); if ni >= h || nj >= w { continue; } let nd = d.saturating_add(a[ni][nj] as u32); if dist[ni][nj] > nd { dist[ni][nj] = nd; heap.push((Reverse(nd), ni, nj)); } } } println!("-1"); }