Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "sort"8)9 10type odtBlock896C struct {11 l, r int12 val int6413}14 15type odt896C []odtBlock896C16 17func (t *odt896C) split(mid int) int {18 ot := *t19 for i, b := range ot {20 if b.l == mid+1 {21 return i22 }23 if b.l <= mid && mid < b.r {24 *t = append(ot[:i+1], append(odt896C{{mid + 1, b.r, b.val}}, ot[i+1:]...)...)25 ot[i].r = mid26 return i + 127 }28 }29 return len(ot)30}31 32func (t *odt896C) prepare(l, r int) (begin, end int) {33 begin = t.split(l - 1)34 end = t.split(r)35 return36}37 38func (t *odt896C) merge(begin, end, r int, val int64) {39 ot := *t40 ot[begin].r = r41 ot[begin].val = val42 if begin+1 < end {43 *t = append(ot[:begin+1], ot[end:]...)44 }45}46 47func (t odt896C) add(begin, end int, val int64) {48 for i := begin; i < end; i++ {49 t[i].val += val50 }51}52 53func (t odt896C) kth(begin, end, k int) int64 {54 blocks := make(odt896C, end-begin)55 copy(blocks, t[begin:end])56 sort.Slice(blocks, func(i, j int) bool { return blocks[i].val < blocks[j].val })57 k--58 for _, b := range blocks {59 if cnt := b.r - b.l + 1; k >= cnt {60 k -= cnt61 } else {62 return b.val63 }64 }65 panic(k)66}67 68func (odt896C) quickPow(x int64, n int, mod int64) int64 {69 x %= mod70 res := int64(1) % mod71 for ; n > 0; n >>= 1 {72 if n&1 == 1 {73 res = res * x % mod74 }75 x = x * x % mod76 }77 return res78}79 80func (t odt896C) powSum(begin, end int, n int, mod int64) (res int64) {81 for _, b := range t[begin:end] {82 res += int64(b.r-b.l+1) * t.quickPow(b.val, n, mod)83 }84 return res % mod85}86 8788func Sol896C(reader io.Reader, writer io.Writer) {89 in := bufio.NewReader(reader)90 out := bufio.NewWriter(writer)91 defer out.Flush()92 93 var n, m, vMax int94 var seed int6495 Fscan(in, &n, &m, &seed, &vMax)96 rand := func(_n int) int {97 const mod int64 = 1e9 + 798 ret := seed99 seed = (seed*7 + 13) % mod100 return int(ret) % _n101 }102 103 t := make(odt896C, n)104 for i := range t {105 t[i] = odtBlock896C{i, i, int64(rand(vMax) + 1)}106 }107 for ; m > 0; m-- {108 op := rand(4) + 1109 l, r := rand(n), rand(n)110 if l > r {111 l, r = r, l112 }113 var x int114 if op == 3 {115 x = rand(r-l+1) + 1116 } else {117 x = rand(vMax) + 1118 }119 begin, end := t.prepare(l, r)120 switch op {121 case 1:122 t.add(begin, end, int64(x))123 case 2:124 t.merge(begin, end, r, int64(x))125 case 3:126 Fprintln(out, t.kth(begin, end, x))127 default:128 y := int64(rand(vMax) + 1)129 Fprintln(out, t.powSum(begin, end, x, y))130 }131 }132}133 134135136