Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type node24 struct {11 lr [2]*node2412 priority uint13 v, c1 int14}15 16func (o *node24) cmp(b int) int {17 switch {18 case b < o.v:19 return 020 case b > o.v:21 return 122 default:23 return -124 }25}26 27func (o *node24) rotate(d int) *node24 {28 x := o.lr[d^1]29 o.lr[d^1] = x.lr[d]30 x.lr[d] = o31 return x32}33 34type treap24 struct {35 rd uint36 root *node2437}38 39func (t *treap24) fastRand() uint {40 t.rd ^= t.rd << 1341 t.rd ^= t.rd >> 1742 t.rd ^= t.rd << 543 return t.rd44}45 46func (t *treap24) _put(o *node24, v, c1 int) *node24 {47 if o == nil {48 return &node24{priority: t.fastRand(), v: v, c1: c1}49 }50 if d := o.cmp(v); d >= 0 {51 o.lr[d] = t._put(o.lr[d], v, c1)52 if o.lr[d].priority > o.priority {53 o = o.rotate(d ^ 1)54 }55 }56 return o57}58 59func (t *treap24) put(v, c1 int) { t.root = t._put(t.root, v, c1) }60 61func (t *treap24) prev(v int) (prev *node24) {62 for o := t.root; o != nil; {63 if o.cmp(v) <= 0 {64 o = o.lr[0]65 } else {66 prev = o67 o = o.lr[1]68 }69 }70 return71}72 73func (t *treap24) lowerBound(v int) (lb *node24) {74 for o := t.root; o != nil; {75 switch c := o.cmp(v); {76 case c == 0:77 lb = o78 o = o.lr[0]79 case c > 0:80 o = o.lr[1]81 default:82 return o83 }84 }85 return86}87 88func CF424D(_r io.Reader, out io.Writer) {89 in := bufio.NewReader(_r)90 var n, m, tar, p, u, d, R1, C1, R2, C2 int91 Fscan(in, &n, &m, &tar, &p, &u, &d)92 f := func(from, to int) int {93 if from < to {94 return u95 }96 if from > to {97 return d98 }99 return p100 }101 a := make([][]int, n)102 lr := make([][]int, n)103 rl := make([][]int, n)104 for i := range a {105 a[i] = make([]int, m)106 lr[i] = make([]int, m)107 rl[i] = make([]int, m)108 for j := range a[i] {109 Fscan(in, &a[i][j])110 if j > 0 {111 lr[i][j] = lr[i][j-1] + f(a[i][j-1], a[i][j])112 rl[i][j] = rl[i][j-1] + f(a[i][j], a[i][j-1])113 }114 }115 }116 ud := make([][]int, m)117 du := make([][]int, m)118 for j := 0; j < m; j++ {119 ud[j] = make([]int, n)120 du[j] = make([]int, n)121 for i := 1; i < n; i++ {122 ud[j][i] = ud[j][i-1] + f(a[i-1][j], a[i][j])123 du[j][i] = du[j][i-1] + f(a[i][j], a[i-1][j])124 }125 }126 127 minD := int(1e9)128 for r1, lr1 := range lr {129 for r2 := r1 + 2; r2 < n; r2++ {130 t := &treap24{rd: 1}131 for c2 := 2; c2 < m; c2++ {132 c1 := c2 - 2133 t.put(lr1[c1]+rl[r2][c1]-du[c1][r2]+du[c1][r1], c1)134 v := lr1[c2] + rl[r2][c2] + ud[c2][r2] - ud[c2][r1] - tar135 if o := t.lowerBound(v); o != nil {136 if d := o.v - v; d < minD {137 minD, R1, C1, R2, C2 = d, r1, o.c1, r2, c2138 }139 }140 if o := t.prev(v); o != nil {141 if d := v - o.v; d < minD {142 minD, R1, C1, R2, C2 = d, r1, o.c1, r2, c2143 }144 }145 }146 }147 }148 Fprint(out, R1+1, C1+1, R2+1, C2+1)149}150 151152