Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "slices"8)9 1011func cf1627E(in io.Reader, _w io.Writer) {12 out := bufio.NewWriter(_w)13 defer out.Flush()14 var T, n, m, k, a, b, c, d, h int15 for Fscan(in, &T); T > 0; T-- {16 Fscan(in, &n, &m, &k)17 x := make([]int, n)18 for i := range x {19 Fscan(in, &x[i])20 }21 type tuple struct{ x, y, h int }22 to := make([]map[int][]tuple, n)23 f := make([]map[int]int, n)24 for i := range to {25 to[i] = map[int][]tuple{}26 f[i] = map[int]int{}27 }28 for range k {29 Fscan(in, &a, &b, &c, &d, &h)30 to[c-1][d-1] = append(to[c-1][d-1], tuple{a - 1, b - 1, h})31 }32 33 for y, ps := range to[n-1] {34 for _, p := range ps {35 res := (m-1-y)*x[n-1] - p.h36 if _, ok := f[p.x][p.y]; !ok {37 f[p.x][p.y] = res38 } else {39 f[p.x][p.y] = min(f[p.x][p.y], res)40 }41 }42 }43 for i := n - 2; i >= 0; i-- {44 type pair struct{ y, res int }45 fi := make([]pair, 2, len(f[i])+2)46 fi[0] = pair{-1, 1e18}47 fi[1] = pair{m, 1e18}48 for y, res := range f[i] {49 fi = append(fi, pair{y, res})50 }51 slices.SortFunc(fi, func(a, b pair) int { return a.y - b.y })52 for j := len(fi) - 3; j > 0; j-- {53 fi[j].res = min(fi[j].res, fi[j+1].res+(fi[j+1].y-fi[j].y)*x[i])54 }55 if i == 0 {56 ans := fi[1].res + fi[1].y*x[i]57 if ans >= 1e17 { 58 Fprintln(out, "NO ESCAPE")59 } else {60 Fprintln(out, ans)61 }62 break63 }64 65 mp := to[i]66 ti := make([]int, 0, len(mp))67 for y := range mp {68 ti = append(ti, y)69 }70 slices.Sort(ti)71 72 mn := int(1e18)73 j := 174 for _, y := range ti {75 for fi[j].y <= y {76 mn = min(mn+(fi[j].y-fi[j-1].y)*x[i], fi[j].res)77 j++78 }79 for _, p := range mp[y] {80 res := min(mn+(y-fi[j-1].y)*x[i], fi[j].res+(fi[j].y-y)*x[i]) - p.h81 if _, ok := f[p.x][p.y]; !ok {82 f[p.x][p.y] = res83 } else {84 f[p.x][p.y] = min(f[p.x][p.y], res)85 }86 }87 }88 }89 }90}91 9293