Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910type seg8 []struct{ l, r, min, todo int }11 12func (t seg8) build(a []int, o, l, r int) {13 t[o].l, t[o].r = l, r14 if l == r {15 t[o].min = a[l]16 return17 }18 m := (l + r) >> 119 t.build(a, o<<1, l, m)20 t.build(a, o<<1|1, m+1, r)21 t[o].min = min8(t[o<<1].min, t[o<<1|1].min)22}23 24func (t seg8) do(o, v int) {25 t[o].min += v26 t[o].todo += v27}28 29func (t seg8) spread(o int) {30 if v := t[o].todo; v != 0 {31 t.do(o<<1, v)32 t.do(o<<1|1, v)33 t[o].todo = 034 }35}36 37func (t seg8) update(o, l, r, v int) {38 if l <= t[o].l && t[o].r <= r {39 t.do(o, v)40 return41 }42 t.spread(o)43 m := (t[o].l + t[o].r) >> 144 if l <= m {45 t.update(o<<1, l, r, v)46 }47 if m < r {48 t.update(o<<1|1, l, r, v)49 }50 t[o].min = min8(t[o<<1].min, t[o<<1|1].min)51}52 53func CF1108E2(_r io.Reader, _w io.Writer) {54 in := bufio.NewReader(_r)55 out := bufio.NewWriter(_w)56 defer out.Flush()57 58 var n, m int59 Fscan(in, &n, &m)60 a := make([]int, n+1)61 for i := 1; i <= n; i++ {62 Fscan(in, &a[i])63 }64 t := make(seg8, n*4)65 t.build(a, 1, 1, n)66 67 ps := make([]struct{ l, r int }, m)68 ls := make([][]int, n+1)69 for i := range ps {70 Fscan(in, &ps[i].l, &ps[i].r)71 l, r := ps[i].l, ps[i].r72 t.update(1, l, r, -1)73 ls[l] = append(ls[l], r)74 }75 76 maxD, maxI := 0, 177 rs := make([][]int, n+1)78 for i := 1; i <= n; i++ {79 for _, r := range ls[i] {80 t.update(1, i, r, 1)81 rs[r] = append(rs[r], i)82 }83 for _, l := range rs[i-1] {84 t.update(1, l, i-1, -1)85 }86 d := a[i] - t[1].min87 if d > maxD {88 maxD, maxI = d, i89 }90 }91 92 Fprintln(out, maxD)93 ids := []interface{}{}94 for i, p := range ps {95 if p.r < maxI || p.l > maxI {96 ids = append(ids, i+1)97 }98 }99 Fprintln(out, len(ids))100 Fprintln(out, ids...)101}102 103104 105func min8(a, b int) int {106 if a > b {107 return b108 }109 return a110}111